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
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
Vamos começar criando um comparador customizado do tipo Comparator
ComparatorbyGradeAsc = (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.
ComparatorbyGradeAscClean = 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
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.
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