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 dimap
. Il metodoflatMap
appiattisce lo stream, combinando gli stream interni in un unico stream.