Lezioni del modulo (2/2)
Stream API
Le Stream API in Java consentono di elaborare collezioni di oggetti in modo dichiarativo, sfruttando la programmazione funzionale. Uno Stream non memorizza dati, bensì trasporta gli elementi da una sorgente (come una lista o un array) attraverso una pipeline di operazioni.
Una pipeline di Stream si compone di tre parti:
- Una sorgente (es.
list.stream()) - Zero o più operazioni intermedie (che restituiscono un nuovo Stream, es.
filter,map) - Un'operazione terminale (che produce un risultato finale o un effetto collaterale e chiude lo Stream, es.
collect,forEach,reduce)
Operazioni Intermedie Comuni
Le operazioni intermedie sono "pigre" (lazy): non vengono eseguite finché non viene invocata un'operazione terminale.
filter(Predicate): filtra gli elementi in base a una condizione booleana.map(Function): trasforma ciascun elemento in un altro oggetto applicando una funzione.sorted(): ordina gli elementi dello Stream.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"
Operazioni Terminali Comuni
forEach(Consumer): esegue un'azione per ogni elemento dello Stream.collect(Collector): raccoglie i risultati dello Stream in un contenitore (es. una lista tramiteCollectors.toList()).reduce(identity, BinaryOperator): combina gli elementi dello Stream in un singolo valore cumulativo.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Somma tutti i numeri: 10
Prova tu
Completa il codice utilizzando lo Stream delle risorse per filtrare solo i numeri pari, raccoglierli in una nuova List denominata evens e stamparla tramite System.out.println.
Mostra suggerimento
Inizia chiamando `numbers.stream()`, aggiungi `.filter(n -> n % 2 == 0)` e infine accumula con `.collect(Collectors.toList())`.
Soluzione disponibile dopo 3 tentativi
Usa gli Stream per trasformare tutti i nomi all'interno della lista names in lettere maiuscole usando map, e stampali a schermo uno alla volta usando forEach con System.lineSeparator o un method reference.
Mostra suggerimento
Usa `.map(s -> s.toUpperCase())` seguito dall'operazione terminale `.forEach(System.out::println)`.
Soluzione disponibile dopo 3 tentativi
Completa il codice calcolando la somma di tutti i numeri presenti nella lista numbers utilizzando uno Stream e l'operazione terminale reduce con valore iniziale 0. Stampa il risultato.
Mostra suggerimento
Usa `numbers.stream().reduce(0, (a, b) -> a + b)` e stampa la variabile contenente il risultato.
Soluzione disponibile dopo 3 tentativi