Vai al contenuto
eLearner.app
Modulo 7 · Lezione 2 di 214/14 nel corso~15 min
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:

  1. Una sorgente (es. list.stream())
  2. Zero o più operazioni intermedie (che restituiscono un nuovo Stream, es. filter, map)
  3. 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.
Code
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 tramite Collectors.toList()).
  • reduce(identity, BinaryOperator): combina gli elementi dello Stream in un singolo valore cumulativo.
Code
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

Esercizio#java.m7.l2.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Inizia chiamando `numbers.stream()`, aggiungi `.filter(n -> n % 2 == 0)` e infine accumula con `.collect(Collectors.toList())`.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m7.l2.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa `.map(s -> s.toUpperCase())` seguito dall'operazione terminale `.forEach(System.out::println)`.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m7.l2.e3
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa `numbers.stream().reduce(0, (a, b) -> a + b)` e stampa la variabile contenente il risultato.

Soluzione disponibile dopo 3 tentativi