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)