Sobes.tech
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]