Middle
A cosa servono gli stream nella nuova versione di Java?
sobes.tech AI
Risposta dell'AI
Gli stream in Java 8+ sono utilizzati per l'elaborazione dichiarativa delle sequenze di dati. Consentono di eseguire operazioni funzionali su collezioni (liste, set), array o altre fonti di dati in uno stile a pipeline.
Vantaggi principali dell'uso degli stream:
- Stile dichiarativo: Permettono di descrivere "cosa" deve essere fatto con i dati, non "come". Questo rende il codice più leggibile e comprensibile.
- Calcoli pigri: Le operazioni vengono elaborate solo quando necessario, migliorando le prestazioni, specialmente con grandi volumi di dati.
- Elaborazione parallela: Gli stream possono essere facilmente parallelizzati (usando
parallelStream()), permettendo di sfruttare efficacemente i processori multi-core. - Riduzione del codice boilerplate: Sostituiscono i cicli tradizionali e gli iteratori con costrutti più espressivi e compatti.
- Immutabilità: Gli stream non modificano la fonte di dati originale.
Esempi di operazioni comuni con gli stream:
- Filtraggio:
filter()- selezione di elementi in base a una condizione. - Trasformazione (mappatura):
map()- trasformazione di ogni elemento. - Ordinamento:
sorted()- ordinamento degli elementi. - Elementi unici:
distinct()- rimozione dei duplicati. - Raggruppamento:
collect(Collectors.groupingBy(...))- raggruppamento di elementi per una caratteristica. - Statistica/Aggregazione:
count(),sum(),average(),max(),min(),reduce()- operazioni di aggregazione. - Raccolta in collezione:
collect(Collectors.toList()),collect(Collectors.toSet())- raccolta dei risultati in una collezione.
Esempio di utilizzo:
// Filtraggio e trasformazione di una lista di stringhe usando gli stream
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream() // Creazione di uno stream dalla lista
.filter(name -> name.startsWith("A")) // Filtra: mantiene solo i nomi che iniziano con "A"
.map(String::toUpperCase) // Trasforma: ogni nome in maiuscolo
.collect(Collectors.toList()); // Raccoglie il risultato in una nuova lista
System.out.println(filteredNames); // Output: [ALICE]