Stream
- Sono una sequenza di elementi su cui possono essere effettuate una o più operazioni
- Vengono creati a partire da una sorgente di dati (per esempio
java.util.Collection
) - Non memorizzano né modificano i dati della sorgente, ma operano su di essa
- Supportano operazioni sequenziali e parallele
Operazioni intermedie e terminali
Intermedie: quando restituiscono un altro stream su cui continuare a lavorare.
Terminali: quando restituiscono il risultato atteso.
Una volta che uno stream è stato consumato (operazione terminale), non può essere riutilizzato.
Operazioni intermedie
filter()
: filtra gli elementi in base a una condizionemap()
: trasforma gli elementi in base a una funzionesorted()
: ordina gli elementi
Operazioni terminali
forEach()
: esegue un’azione per ogni elemento dello streamcollect()
: Raccoglie gli elementi in una struttura dati (ad esempio una lista).reduce()
: Riduce gli elementi a un singolo risultato, come la somma o la concatenazione.
Metodi principali
Gli stream hanno un comportamento pigro (lazy behaviour), questo significa che le operazioni intermedie non vengono eseguite immediatamente, ma solo quando si richiede l’esecuzione di un’operazione terminale.
Le operazioni possono essere senza stato o con stato.
Senza stato: l’elaborazione dei vari elementi può procedere in modo indipendente.
Con stato: l’elaborazione di un elemento potrebbe dipendere da quella di altri elementi.
Come si ottengono
Gli stream possono essere creati a partire da collections, liste, set, int, long, double, array…
Esempi
Filtra, moltiplica per 2 e stampa i numeri pari
//senza stream
List <Integer> numbers = Array.asList(1,2,3,4,5,6);
for (Integer num : numbers)
{
if (num % 2 == 0)
{
int result = num * 2;
System.out.println(result);
}
}
//con stream
List <Integer> numbers = Array.asList(1,2,3,4,5,6);
numbers.stream() //crea lo stream della lista
.filter(n -> n % 2 == 0) //Filtra: prende solo i numeri pari
.map(n -> n * 2) //Mappatura: moltiplica per 2
.forEach(System.out::println); //Operazione terminale: stampa