Leçons du module (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.
Afficher l'indice
Inizia chiamando `numbers.stream()`, aggiungi `.filter(n -> n % 2 == 0)` e infine accumula con `.collect(Collectors.toList())`.
Solution disponible après 3 tentatives
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.
Afficher l'indice
Usa `.map(s -> s.toUpperCase())` seguito dall'operazione terminale `.forEach(System.out::println)`.
Solution disponible après 3 tentatives
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.
Afficher l'indice
Usa `numbers.stream().reduce(0, (a, b) -> a + b)` e stampa la variabile contenente il risultato.
Solution disponible après 3 tentatives