En este post vamos a ver cómo usar la API de Streams de Java para calcular el máximo y mínimo de una colección de elementos. Para ello, vamos a usar los métodos max() y min() de la clase Stream. Estos métodos nos permiten obtener el máximo y mínimo de una colección de elementos, respectivamente, utilizando un comparador personalizado.
Supongamos que tenemos una lista del 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) );
En versiones recientes de Java se puede utilizar el método max() y min() de la clase Stream para este propósito pasando un comparador personalizado y obteniendo un Optional
Comencemos creando un comparador personalizado del tipo Comparator
ComparatorbyGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());
A manera de ejemplo, este comparador devolverá un número negativo si la calificación del primer examen es menor que la del segundo, cero si son iguales y un número positivo si la calificación del primer examen es mayor que la del segundo, para más información puedes consultar este enlace a un post donde se explica cómo funciona la interfaz Comparator.
Este comparador se puede definir de otra manera utilizando el método comparingDouble() de la clase Comparator que nos permite crear un comparador a partir de una función que extrae un valor doble de un objeto sin la necesidad de escribir el comparador manualmente.
ComparatorbyGradeAscClean = Comparator.comparingDouble(Exam::grade);
En esta definición se le indica al comparador que debe de tomar un objeto del tipo Exam, extraer el valor de la propiedad grade y comparar los valores utilizando un tipo de dato Double.
Estas dos maneras son equivalentes y se pueden utilizar indistintamente, puede que la segunda sea un poco más difícil de entender al principio, pero una vez que se entiende es más fácil de escribir y leer.
Ahora que se tiene el comparador, solo resta utilizarlo en los métodos max() y min() para obtener el examen con la calificación más alta y más baja, respectivamente.
var highestGrade = exams.stream().max(byGradeAscClean); var lowestGrade = exams.stream().min(byGradeAscClean);
En este caso, se obtiene un Optional
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
O simplemente pasar como argumento un método de referencia para imprimir el valor del Optional, en caso de que él Optional esté vacío no se imprimirá nada, caso contrario se imprimirá el valor del Optional llamando al método toString() del objeto Exam.
highestGrade.ifPresent(System.out::println); lowestGrade.ifPresent(System.out::println); // Output Exam[name=Alice, grade=9.5] Exam[name=Bob, grade=6.0]
Listo, de esta manera se puede obtener el máximo y mínimo de una colección de elementos utilizando la API de Streams de Java y la interfaz Comparator.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3