Trovare il massimo / minimo di un elenco o di una raccolta

1. Introduzione

Una rapida introduzione su come trovare il valore minimo / massimo da un determinato elenco / raccolta con la potente API Stream in Java8.

2. Trova Max in un elenco di numeri interi

Possiamo usare il metodo max () fornito tramite l' interfaccia java.util.Stream . Accetta un metodo di riferimento:

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

Diamo uno sguardo più da vicino al codice:

  1. Chiamando il metodo stream () nell'elenco per ottenere un flusso di valori dall'elenco
  2. Chiamata mapToInt (valore -> valore) nel flusso per ottenere un flusso intero
  3. Chiamando il metodo max () sullo stream per ottenere il valore massimo
  4. Chiamando orElseThrow () per generare un'eccezione se non viene ricevuto alcun valore da max ()

3. Trova Min con oggetti personalizzati

Per trovare il minimo / massimo sugli oggetti personalizzati, possiamo anche fornire un'espressione lambda per la nostra logica di ordinamento preferita.

Definiamo prima il POJO personalizzato:

class Person { String name; Integer age; // standard constructors, getters and setters }

Vogliamo trovare l' oggetto Persona con l'età minima:

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

Diamo un'occhiata a questa logica:

  1. Chiamando il metodo stream () nell'elenco per ottenere un flusso di valori dall'elenco
  2. Chiamando il metodo min () sullo stream per ottenere il valore minimo. Stiamo passando una funzione lambda come comparatore, questa viene utilizzata per decidere la logica di ordinamento per decidere il valore minimo
  3. Chiamando orElseThrow () per generare un'eccezione se nessun valore viene ricevuto da min ()

4. Conclusione

In questo rapido articolo, abbiamo esplorato come i metodi max () e min () dell'API Stream di Java 8 possono essere utilizzati per trovare il valore massimo e minimo da un elenco / raccolta.

Come sempre, il codice è disponibile su Github.