Trouver Max/Min d’une liste ou d’une collection

Trouver Max / Min d'une liste ou d'une collection

1. introduction

Une introduction rapide sur la façon de trouver la valeur min / max à partir d'une liste / collection donnée avec la puissante APIStream en Java8.

2. Rechercher Max dans une liste d'entiers

Nous pouvons utiliser la méthodemax() fournie via l'interfacejava.util.Stream. Il accepte une référence de méthode:

@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);
}

Examinons de plus près le code:

  1. Appel de la méthodestream() sur la liste pour obtenir un flux de valeurs de la liste

  2. Appel demapToInt(value → value) sur le flux pour obtenir un flux entier

  3. Appel de la méthodemax() sur le flux pour obtenir la valeur maximale

  4. Appel deorElseThrow() pour lever une exception si aucune valeur n'est reçue demax()

3. Rechercher min avec des objets personnalisés

Afin de trouver le min / max sur des objets personnalisés, nous pouvons également fournir une expression lambda pour notre logique de tri préférée.

Définissons d'abord le POJO personnalisé:

class Person {
    String name;
    Integer age;

    // standard constructors, getters and setters
}

Nous voulons trouver l'objetPerson avec l'âge minimum:

@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);
}

Jetons un œil à cette logique:

  1. Appel de la méthodestream() sur la liste pour obtenir un flux de valeurs de la liste

  2. Appel de la méthodemin() sur le flux pour obtenir la valeur minimale. Nous passons une fonction lambda en tant que comparateur, elle est utilisée pour décider de la logique de tri pour déterminer la valeur minimale.

  3. Appel deorElseThrow() pour lever une exception si aucune valeur n'est reçue de min()

4. Conclusion

Dans cet article rapide, nous avons exploré comment les méthodesmax() etmin() de l'APIStream de Java 8 peuvent être utilisées pourfind the maximum and minimum value from a List/Collection.

Comme toujours, le code est disponibleover on Github.