Localizando Max/Min de uma lista ou coleção

Localizando Max / Min de uma lista ou coleção

1. Introdução

Uma introdução rápida sobre como encontrar o valor mínimo / máximo de uma determinada lista / coleção com a poderosa APIStream em Java8.

2. Encontre o máximo em uma lista de inteiros

Podemos usar o métodomax() fornecido por meio da interfacejava.util.Stream. Ele aceita uma referência de método:

@Test
public void whenListIsOfIntegerThenMaxCanBeDoneUsingIntegerComparator() {
    // given
    List listOfIntegers = Arrays.asList(1, 2, 3, 4, 56, 7, 89, 10);
    Integer expectedResult = 89;

    // then
    Integer max = listOfIntegers
      .stream()
      .mapToInt(v -> v)
      .max().orElseThrow(NoSuchElementException::new);

    assertEquals("Should be 89", expectedResult, max);
}

Vamos dar uma olhada no código:

  1. Chamando o métodostream() na lista para obter um fluxo de valores da lista

  2. ChamandomapToInt(value → value) no fluxo para obter um fluxo inteiro

  3. Chamando o métodomax() no stream para obter o valor máximo

  4. ChamarorElseThrow() para lançar uma exceção se nenhum valor for recebido demax()

3. Encontre Min com objetos personalizados

Para encontrar o mínimo / máximo em objetos personalizados, também podemos fornecer uma expressão lambda para nossa lógica de classificação preferida.

Vamos primeiro definir o POJO personalizado:

class Person {
    String name;
    Integer age;

    // standard constructors, getters and setters
}

Queremos encontrar o objetoPerson com a idade mínima:

@Test
public void whenListIsOfPersonObjectThenMinCanBeDoneUsingCustomComparatorThroughLambda() {
    // given
    Person alex = new Person("Alex", 23);
    Person john = new Person("John", 40);
    Person peter = new Person("Peter", 32);
    List people = Arrays.asList(alex, john, peter);

    // then
    Person minByAge = people
      .stream()
      .min(Comparator.comparing(Person::getAge))
      .orElseThrow(NoSuchElementException::new);

    assertEquals("Should be Alex", alex, minByAge);
}

Vamos dar uma olhada nesta lógica:

  1. Chamando o métodostream() na lista para obter um fluxo de valores da lista

  2. Chamando o métodomin() no fluxo para obter o valor mínimo. Estamos passando uma função lambda como um comparador, isso é usado para decidir a lógica de classificação para decidir o valor mínimo

  3. ChamarorElseThrow() para lançar uma exceção se nenhum valor for recebido de min()

4. Conclusão

Neste artigo rápido, exploramos como os métodosmax()emin() da APIStream do Java 8 podem ser usados ​​parafind the maximum and minimum value from a List/Collection.

Como sempre, o código está disponívelover on Github.