Encontrar el máximo y mínimo de una Lista en Java con Stream

Max y mínimo de una lista en Java

Max y mínimo de una lista en Java


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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *