Sobes.tech
Middle

Perché vengono utilizzati gli stream nella nuova versione di Java?

sobes.tech AI

Risposta dell'AI

L'uso degli stream nelle versioni più recenti di Java (a partire da Java 8) è motivato da diverse ragioni legate all'efficienza, alla leggibilità del codice e all'elaborazione parallela dei dati:

  • Programmazione funzionale: Gli stream consentono di scrivere codice in uno stile più dichiarativo, concentrandosi su cosa fare con i dati, anziché come. Questo migliora la leggibilità e la manutenibilità.
  • Elaborazione parallela: Gli stream facilitano la parallelizzazione delle operazioni sulle collezioni tramite parallelStream(). La JVM gestisce la suddivisione dei dati e l'unione dei risultati, semplificando lo sviluppo di applicazioni multithread.
  • Efficienza: La valutazione pigra (lazy evaluation) negli stream significa che le operazioni vengono eseguite solo quando necessario, riducendo i costi. Le operazioni intermedie (map, filter) non vengono eseguite immediatamente fino alla chiamata di un'operazione terminale (collect, forEach).
  • Miglior trattamento delle collezioni: Forniscono un insieme di operazioni standard e di alto livello per filtrare, mappare e aggregare i dati nelle collezioni, riducendo la quantità di codice ripetitivo con i cicli.
  • Operazioni immutabili: Gli stream non modificano la collezione originale da cui sono creati, rispettando i principi di immutabilità e facilitando il debug.
// Esempio di utilizzo degli stream per filtrare e mappare
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Creazione dello stream
                                  .filter(name -> name.startsWith("C")) // Filtro
                                  .map(String::toUpperCase) // Mappatura
                                  .collect(Collectors.toList()); // Raccolta in una nuova lista

System.out.println(filteredNames); // Output: [CHARLIE]

Stream paralleli:

// Esempio di elaborazione parallela in uno stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Creazione di uno stream parallelo
                   .mapToInt(Integer::intValue) // Conversione in IntStream
                   .sum(); // Somma

System.out.println(sum); // Output: 55 (può essere calcolato più velocemente su sistemi multicore)