Encontrar el máximo y mínimo de una Lista en Java con Stream
Cuando trabajamos con listas (Collections) en Java es muy común querer encontrar el máximo y mínimo de una Lista en Java con Streams, desde la entrada de Java 8 esta tarea se ha hecho algo más sencilla. En este artículo vamos a ver como encontrar el máximo y mínimo de una lista haciendo uso de Streams de Java.
Encontrar el número más pequeño de una lista de enteros
De una lista de números enteros vamos a encontrar el número más pequeño, para ello vamos a hacer uso de la función min().
@Test public void given_a_list_of_integer_when_get_min_then_min_value_is_returned() { List<Integer> integers = Arrays.asList(10, 12, 13, 15, 2, 4, 7, 9); Integer expected = 2; Integer min = integers .stream() .min(Comparator.comparing( v->v)) .orElseThrow(NoSuchElementException::new); assertEquals(2,min); }
A destacar del test anterior es que hemos hecho uso de la interfaz funcional Comparator para obtener el valor mínimo de la lista. Si queremos evitar hacer uso del Comparator podemos hacerlo de la siguiente manera:
@Test public void given_a_list_of_integer_when_get_min_then_min_value_is_returned() { List<Integer> integers = Arrays.asList(10, 12, 13, 15, 2, 4, 7, 9); Integer expected = 2; Integer min = integers .stream() .mapToInt(v -> v) .min() .orElseThrow(NoSuchElementException::new); assertEquals(2,min); }
Obtener el valor mayor de una lista de enteros
Para obtener el valor mayor de una lista de enteros con un Stream de Java, vamos a hacer uso de la función max(). Vamos a ver como dos maneras diferentes de realizarlo.
La primera manera es haciendo uso de Comparator:
@Test public void given_a_list_of_integer_when_get_max_then_max_value_is_returned() { List<Integer> integers = Arrays.asList(10, 12, 13, 15, 2, 4, 7, 9); Integer expected = 15; Integer max = integers .stream() .max(Comparator.comparing( v->v)) .orElseThrow(NoSuchElementException::new); assertEquals(15,max); }
Haciendo uso de mapToInt sin necesidad de hacer uso de la interfaz funcional Comporator:
@Test public void given_a_list_of_integer_when_get_max_then_max_value_is_returned() { List<Integer> integers = Arrays.asList(10, 12, 13, 15, 2, 4, 7, 9); Integer expected = 15; Integer max = integers .stream() .mapToInt(v -> v) .max() .orElseThrow(NoSuchElementException::new); assertEquals(15,max); }
Como podemos ver obtener el máximo es igual que obtener el mínimo con la única diferencia de hacer uso de min() y max().
Vamos a ver cuando necesitamos obtener el máximo y mínimo de un objeto propio.
Obtener el máximo de un elemento de una lista
A continuación vamos a ver como obtener el máximo de una lista cuando tenemos una lista de objetos propios.
Para poder obtener el máximo de una lista de objetos propios vamos a hacer uso de la interfaz funcional Comparator.
@Getter @Setter @AllArgsConstructor class User { private String id; private Integer age; private String surname; private String name; }
@Test public void given_a_list_of_user_when_get_max_age_then_max_age_value_is_returned() { User user1 = new User("1", 2, "Rdz", "Pablo"); User user2 = new User("1", 39, "Rdz", "Noel"); List<User> users = Arrays.asList(user1, user2); User maxAge = users .stream() .max(Comparator.comparing(User::getAge)) .orElseThrow(NoSuchElementException::new); assertEquals(39, maxAge); }
Obtener el mínimo de un elemento de una lista
Para obtener el mínimo de una lista de Objetos vamos a hacer uso de la función min() y de la interfaz funcional Comparator, para comparar los distintos valores. Vamos a ver un ejemplo:
@Data class User { private String id; private Integer age; private String surname; private String name; }
@Test public void given_a_list_of_user_when_get_min_age_then_min_age_value_is_returned() { User user1 = new User("1", 2, "Rdz", "Pablo"); User user2 = new User("1", 39, "Rdz", "Noel"); List<User> users = Arrays.asList(user1, user2); User minAge = users .stream() .min(Comparator.comparing(User::getAge)) .orElseThrow(NoSuchElementException::new); assertEquals(2, minAge); }
Conclusión
En este breve artículo hemos visto como podemos encontrar el máximo y mínimo de una Lista en Java con Stream de una manera fácil y sencilla.
Si quieres ver más artículos sobre Streams en Java quizás te interese:
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!