"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como calcular máximo e mínimo em Java usando Streams?

Como calcular máximo e mínimo em Java usando Streams?

Publicado em 2024-11-18
Navegar:570

¿Cómo calcular el máximo y mínimo en Java usando Streams?

Neste post veremos como usar a API Java Streams para calcular o máximo e o mínimo de uma coleção de elementos. Para fazer isso, usaremos os métodos max() e min() da classe Stream. Esses métodos nos permitem obter o máximo e o mínimo de uma coleção de elementos, respectivamente, usando um comparador customizado.

Suponha que temos uma lista do tipo List onde Exame é um registro com duas propriedades nome e nota, e queremos obter o exame com a nota mais alta e a nota mais baixa.

public record Exam(String name, Double grade) { }
var exams = Arrays.asList(
        new Exam("Alice", 9.5),
        new Exam("Bob", 6.0),
        new Exam("Charlie", 7.5),
        new Exam("David", 8.0),
        new Exam("Eve", 8.5)
);

Em versões recentes do Java você pode usar os métodos max() e min() da classe Stream para essa finalidade, passando um comparador personalizado e obtendo um opcional com o resultado. Caso a versão Java não suporte os métodos max() e min(), o método collect() pode ser utilizado passando um Collector como parâmetro, seja Collectors.maxBy() ou Collectors.minBy(), e por sua vez um comparador personalizado. Se você usar esta última opção em uma versão recente do Java, o próprio IDE irá sugerir alterá-la para o método max() ou min().

Vamos começar criando um comparador customizado do tipo Comparator que nos permite obter as notas em ordem crescente.

Comparator byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());

A título de exemplo, este comparador retornará um número negativo se a nota do primeiro exame for menor que a do segundo, zero se forem iguais e um número positivo se a nota do primeiro exame for maior que a do a segunda, para mais informações você pode consultar este link para um post que explica como funciona a interface do Comparador.

Este comparador pode ser definido de outra forma usando o método comparandoDouble() da classe Comparator que nos permite criar um comparador a partir de uma função que extrai um valor duplo de um objeto sem a necessidade de escrever o comparador manualmente.

Comparator byGradeAscClean = Comparator.comparingDouble(Exam::grade);

Nesta definição o comparador é informado que deve pegar um objeto do tipo Exame, extrair o valor da propriedade nota e comparar os valores usando um tipo de dados Double.

Essas duas formas são equivalentes e podem ser usadas de forma intercambiável, a segunda pode ser um pouco mais difícil de entender no início, mas depois de entendida fica mais fácil de escrever e ler.

Agora que você tem o comparador, só falta utilizá-lo nos métodos max() e min() para obter o exame com maior e menor pontuação, respectivamente.

var highestGrade = exams.stream().max(byGradeAscClean);
var lowestGrade = exams.stream().min(byGradeAscClean);

Neste caso, um Opcional é obtido com o exame com maior e menor pontuação, respectivamente. Caso a lista de exames esteja vazia, será retornado um opcional.empty(). Para obter o valor do Opcional você pode usar o método ifPresent() que recebe um Consumidor e executa o código passado a ele como argumento se existir um valor.

highestGrade.ifPresent(ex -> System.out.println("Highest grade: "   ex.name()   " "   ex.grade()));
lowestGrade.ifPresent(ex -> System.out.println("Lowest grade: "   ex.name()   " "   ex.grade()));

// Output
Highest grade: Alice 9.5
Lowest grade: Bob 6.0

Ou simplesmente passe um método de referência como argumento para imprimir o valor do Opcional, se o Opcional estiver vazio nada será impresso, caso contrário o valor do Opcional será impresso chamando o método toString() do objeto Exame

highestGrade.ifPresent(System.out::println);
lowestGrade.ifPresent(System.out::println);

// Output
Exam[name=Alice, grade=9.5]
Exam[name=Bob, grade=6.0]

Aí, desta forma você pode obter o máximo e o mínimo de uma coleção de elementos usando a API Java Streams e a interface Comparator.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1 Caso haja alguma infração, entre em contato com study_golang@163 .com para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3