Min e Max

min(comparator) e max(comparator) restituiscono il minimo e il massimo di uno stream confrontando in base al comparator passato.

// Esempi
Integer min = stream.min(Integer::compare)
Integer max = stream.max(Integer::compare)
Integer min = stream.min((a, b) -> a.compareTo(b)

Filter

filter(predicate) restituisce un nuovo stream con i soli elementi che rispettano il predicate dato.

Stream<String> stream2 = Stream.of("apple", "banana", "cherry", "avocado"); 
stream2.filter(s -> s.startsWith("a"))
 
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 10, 20, 30); 
stream.filter(n -> n > 10)

ForEach

Prende in input un consumer e lo applica a tutti gli elementi dello stream.

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 10, 20, 30); 
stream.forEach(System.out::println);

Count

Restituisce un long che rappresenta il numero di elementi dello stream

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
long count = stream.count();

Sorted

Restituisce uno stream ordinato secondo l’ordinamento naturale degli elementi o è possibile passare un comparator.

// Ordina gli elementi di uno stream di oggetti Persona in base all'età 
 
Stream<Persona> stream = Stream.of( 
	new Persona("Mario", 30), 
	new Persona("Luigi",25), 
	new Persona("Giovanni", 40) 
); 
stream.sorted((p1, p2) -> Integer.compare(p1.getEta(p2.getEta())));

Map

Restituisce un nuovo stream dove ciascun elemento è stato convertito tramite la funzione passata in input.

Stream<Integer> stream = Stream.of(5, 2, 8, 1, 9, 15, 20); 
stream.map(n -> n * 2)
 
// Trasforma gli elementi di uno stream di stringhe in un nuovo tipo di dati e poi appiattisce il risultato 
Stream<String> stream = Stream.of("1,2,3", "4,5,6"); 
stream.map(s -> s.split(",")).flatMap(Arrays::stream).forEach(System.out::println);

Collect

Raccogli gli elementi di uno stream in un oggetto (Array, String, Lista, Set…) e lo restituisce come risultato.

Collect è uno strumento molto potente vedi la sezione Java - Collectors per approfondire.

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
 
// Raccogli in una lista di interi
List<Integer> lista = stream.collect(Collectors.toList());
// Raccogli in una array di interi
Integer[] array = stream3.collect(Collectors.toArray(Integer[]::new)); 

Distinct

Restituisce un nuovo stream ma senza ripetizioni

// Rimuove gli elementi duplicati da uno stream di numeri interi 
Stream<Integer> stream = Stream.of(1, 2, 2, 3, 3, 3, 4, 5, 5); 
stream.distinct().forEach(System.out::println);

Reduce

Applica una funzione di riduzione a tutti gli elementi dello stream, riducendoli a un singolo valore.

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
int somma = stream.reduce((a, b) -> a + b)

Limit

Metodo che prende in input un long n e restituisce uno stream che contiene solo i primi n elementi dello stream originale.

Stream<String> stream = Stream.of("1", "2", "3", "4", "5"); 
Stream<String> limitStream = stream.limit(3);

Skip

Metodo che prende in input un long n e restituisce uno stream che salta i primi n elementi dello stream originale e contiene solo gli elementi rimanenti.

Stream<String> stream = Stream.of("1", "2", "3", "4", "5"); 
Stream<String> limitStream = stream.skip(3);

TakeWhile e DropWhile

takeWhile: restituisce uno stream che contiene tutti gli elementi dello stream originale fino a quando la condizione specificata (predicate) non viene violata.

dropWhile: restituisce uno stream che salta tutti gli elementi dello stream originale fino a quando la condizione specificata (predicate) non viene violata.

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9); 
 
Stream<Integer> takeWhileStream = stream.takeWhile(n -> n <= 5);
Stream<Integer> dropWhileStream = stream.dropWhile(n -> n <= 5);

AnyMatch, AllMatch e NonoMatch

anyMatch: restituisce true se almeno un elemento dello stream soddisfa la condizione specificata (predicate), false altrimenti.

allMatch: restituisce true se tutti gli elementi dello stream soddisfano la condizione specificata (predicate), false altrimenti.

noneMatch: restituisce true se nessun elemento dello stream soddisfa la condizione specificata (predicate), false altrimenti.

Stream<Integer> stream = Stream.of(6, 7, 8, 9); 
 
boolean result = stream.allMatch(n -> n > 5);
boolean result = stream.noneMatch(n -> n > 5);
boolean result = stream.anyMatch(n -> n > 5);

FindFirst e FindAny

findFirst: restituisce il primo elemento dello stream che soddisfa la condizione specificata (predicate), o un Optional vuoto se nessun elemento soddisfa la condizione.

findAny: restituisce un elemento qualsiasi dello stream che soddisfa la condizione specificata (predicate), o un Optional vuoto se nessun elemento soddisfa la condizione.

FlatMap

Il metodo flatMap è un metodo che prende un stream di elementi e applica una funzione di trasformazione a ciascun elemento del stream. Se la funzione di trasformazione restituisce un nuovo stream di elementi allora allora verrà appiattito formando un unico stream.

Esempio

Quando si utilizza il metodo map(Arrays::stream) su uno stream di array, si ottiene uno stream di stream, poiché ogni array viene trasformato in uno stream separato.

Per ottenere un unico stream dove gli elementi degli array diventano elementi dello stream, è necessario utilizzare il metodo flatMap(Arrays::stream) invece di map. Il metodo flatMap appiattisce lo stream, combinando gli stream interni in un unico stream.