Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Lavorare con Strutture Annidate con il Metodo flatMap() | Operazioni Intermedie Nello Stream API
Stream API

bookLavorare con Strutture Annidate con il Metodo flatMap()

Quando si lavora con collezioni di dati in Java, spesso si incontrano situazioni in cui le nostre strutture sono annidate. Ad esempio, si potrebbe avere una lista di oggetti, ciascuno contenente un'altra lista di oggetti.

In questi casi, le operazioni standard come map() non sono adatte per estrarre tutti i dati annidati in un unico stream. È qui che entra in gioco il metodo flatMap() della Stream API.

Il metodo flatMap() accetta una funzione che trasforma ogni elemento dello stream in un nuovo stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — il tipo degli elementi nello stream risultante;
  • Function<? super T, ? extends Stream<? extends R>> mapper — una funzione che prende un elemento dallo stream originale (T) e restituisce uno stream (Stream<R>) di elementi risultanti.

È importante comprendere che flatMap() non restituisce semplicemente un nuovo elemento, ma piuttosto uno stream (o un'altra collezione) per ogni elemento. Questi singoli stream vengono poi combinati in uno solo.

Applicazione pratica

Immagina di avere più fabbriche, ognuna delle quali produce diversi tipi di prodotti. L'obiettivo è creare un'unica lista di tutti i prodotti provenienti da queste fabbriche e convertire i loro nomi in maiuscolo.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }

La lista factories contiene diversi oggetti Factory, ognuno dei quali possiede un name e una lista di products. Poiché getProducts() restituisce una lista, chiamare stream() su factories normalmente produrrebbe uno stream di oggetti Factory, che non è ciò di cui abbiamo bisogno.

Per estrarre i veri nomi dei prodotti, si utilizza flatMap(factory -> factory.getProducts().stream()). Questo appiattisce tutte le liste di prodotti in un unico stream continuo di valori String.

Successivamente, map(String::toUpperCase) applica il metodo toUpperCase() a ciascun nome di prodotto, assicurando che tutti i nomi siano in maiuscolo prima di raccoglierli in productList utilizzando toList().

Unione di Collezioni in Una Sola

Quando i dati sono organizzati come collezioni annidate, il metodo flatMap() aiuta a unirle in un unico stream, facilitando l'ulteriore elaborazione. Ad esempio, è possibile combinare un array che contiene altri array in un unico array.

Esempio

Sono presenti diverse linee di produzione, ognuna delle quali produce diversi prodotti. L'obiettivo è ottenere un unico elenco di tutti i prodotti realizzati su queste linee.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }

Questo codice utilizza flatMap() per unire liste annidate di prodotti provenienti da diverse linee di produzione in un unico stream unificato.

Ogni linea di produzione, rappresentata come una lista di prodotti, viene convertita in uno stream di elementi, che viene poi raccolto in una lista finale utilizzando toList(). Il risultato è un unico elenco contenente tutti i prodotti realizzati nello stabilimento.

1. Cosa fa il metodo flatMap() nell'API Stream?

2. Cosa succede quando si utilizza flatMap() con collezioni annidate?

question mark

Cosa fa il metodo flatMap() nell'API Stream?

Select the correct answer

question mark

Cosa succede quando si utilizza flatMap() con collezioni annidate?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

Can you show me a code example using flatMap() with nested lists?

What is the difference between map() and flatMap() in Java Streams?

Can you explain how flatMap() works step by step with a real-world scenario?

Awesome!

Completion rate improved to 2.33

bookLavorare con Strutture Annidate con il Metodo flatMap()

Scorri per mostrare il menu

Quando si lavora con collezioni di dati in Java, spesso si incontrano situazioni in cui le nostre strutture sono annidate. Ad esempio, si potrebbe avere una lista di oggetti, ciascuno contenente un'altra lista di oggetti.

In questi casi, le operazioni standard come map() non sono adatte per estrarre tutti i dati annidati in un unico stream. È qui che entra in gioco il metodo flatMap() della Stream API.

Il metodo flatMap() accetta una funzione che trasforma ogni elemento dello stream in un nuovo stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — il tipo degli elementi nello stream risultante;
  • Function<? super T, ? extends Stream<? extends R>> mapper — una funzione che prende un elemento dallo stream originale (T) e restituisce uno stream (Stream<R>) di elementi risultanti.

È importante comprendere che flatMap() non restituisce semplicemente un nuovo elemento, ma piuttosto uno stream (o un'altra collezione) per ogni elemento. Questi singoli stream vengono poi combinati in uno solo.

Applicazione pratica

Immagina di avere più fabbriche, ognuna delle quali produce diversi tipi di prodotti. L'obiettivo è creare un'unica lista di tutti i prodotti provenienti da queste fabbriche e convertire i loro nomi in maiuscolo.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Factory> factories = Arrays.asList( new Factory("SteelWorks", Arrays.asList("Drill", "Excavator", "Bulldozer")), new Factory("AutoParts", Arrays.asList("Carburetor", "Piston", "Transmission")), new Factory("ToolMakers", Arrays.asList("Screwdriver", "Wrench", "Hammer")) ); List<String> productList = factories.stream() .flatMap(factory -> factory.getProducts().stream()) // Flatten all product lists into a single stream .map(String::toUpperCase) // Convert product names to uppercase .toList(); // Collect results into a list System.out.println(productList); } } class Factory { private String name; private List<String> products; public Factory(String name, List<String> products) { this.name = name; this.products = products; } public List<String> getProducts() { return products; } }

La lista factories contiene diversi oggetti Factory, ognuno dei quali possiede un name e una lista di products. Poiché getProducts() restituisce una lista, chiamare stream() su factories normalmente produrrebbe uno stream di oggetti Factory, che non è ciò di cui abbiamo bisogno.

Per estrarre i veri nomi dei prodotti, si utilizza flatMap(factory -> factory.getProducts().stream()). Questo appiattisce tutte le liste di prodotti in un unico stream continuo di valori String.

Successivamente, map(String::toUpperCase) applica il metodo toUpperCase() a ciascun nome di prodotto, assicurando che tutti i nomi siano in maiuscolo prima di raccoglierli in productList utilizzando toList().

Unione di Collezioni in Una Sola

Quando i dati sono organizzati come collezioni annidate, il metodo flatMap() aiuta a unirle in un unico stream, facilitando l'ulteriore elaborazione. Ad esempio, è possibile combinare un array che contiene altri array in un unico array.

Esempio

Sono presenti diverse linee di produzione, ognuna delle quali produce diversi prodotti. L'obiettivo è ottenere un unico elenco di tutti i prodotti realizzati su queste linee.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // List of production lines with their products List<List<String>> productionLines = Arrays.asList( Arrays.asList("Tire", "Rim", "Shock Absorber"), Arrays.asList("Frame", "Tread", "Ball Joint"), Arrays.asList("Brakes", "Steering System") ); // Get a single list of all products manufactured in the factory List<String> allProducts = productionLines.stream() .flatMap(line -> line.stream()) // Convert each production line's product list into a stream .toList(); // Collect all products into a single list System.out.println(allProducts); } }

Questo codice utilizza flatMap() per unire liste annidate di prodotti provenienti da diverse linee di produzione in un unico stream unificato.

Ogni linea di produzione, rappresentata come una lista di prodotti, viene convertita in uno stream di elementi, che viene poi raccolto in una lista finale utilizzando toList(). Il risultato è un unico elenco contenente tutti i prodotti realizzati nello stabilimento.

1. Cosa fa il metodo flatMap() nell'API Stream?

2. Cosa succede quando si utilizza flatMap() con collezioni annidate?

question mark

Cosa fa il metodo flatMap() nell'API Stream?

Select the correct answer

question mark

Cosa succede quando si utilizza flatMap() con collezioni annidate?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 4
some-alt