Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Arbeiten mit Verschachtelten Strukturen mit der flatMap()-Methode | Intermediate-Operationen im Stream-API
Stream-API

bookArbeiten mit Verschachtelten Strukturen mit der flatMap()-Methode

Beim Arbeiten mit Datensammlungen in Java trifft man häufig auf Situationen, in denen unsere Strukturen verschachtelt sind. Zum Beispiel kann es eine Liste von Objekten geben, von denen jedes eine weitere Liste von Objekten enthält.

In solchen Fällen sind Standardoperationen wie map() nicht geeignet, um alle verschachtelten Daten in einem einzigen Stream zu extrahieren. Hier kommt die Methode flatMap() aus der Stream API zum Einsatz.

Die Methode flatMap() nimmt eine Funktion entgegen, die jedes Element des Streams in einen neuen Stream umwandelt.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — der Typ der Elemente im resultierenden Stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — eine Funktion, die ein Element aus dem ursprünglichen Stream (T) entgegennimmt und einen Stream (Stream<R>) der resultierenden Elemente zurückgibt.

Es ist wichtig zu verstehen, dass flatMap() nicht einfach ein neues Element zurückgibt, sondern für jedes Element einen Stream (oder eine andere Collection). Diese einzelnen Streams werden dann zu einem einzigen kombiniert.

Praktische Anwendung

Stellen Sie sich vor, Sie haben mehrere Fabriken, die jeweils unterschiedliche Produkte herstellen. Unser Ziel ist es, eine einheitliche Liste aller Produkte dieser Fabriken zu erstellen und deren Namen in Großbuchstaben umzuwandeln.

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; } }

Die factories Liste enthält mehrere Factory Objekte, von denen jedes einen name und eine Liste von products besitzt. Da getProducts() eine Liste zurückgibt, würde ein Aufruf von stream() auf factories normalerweise einen Stream von Factory Objekten liefern, was jedoch nicht benötigt wird.

Um die tatsächlichen Produktnamen zu extrahieren, wird flatMap(factory -> factory.getProducts().stream()) verwendet. Dies flattens alle Produktlisten zu einem einzelnen kontinuierlichen Stream von String-Werten.

Anschließend wendet map(String::toUpperCase) die Methode toUpperCase() auf jeden Produktnamen an, sodass alle Namen in Großbuchstaben vorliegen, bevor sie mit productList in toList() gesammelt werden.

Zusammenführen von Kollektionen zu einer

Wenn Daten als verschachtelte Kollektionen organisiert sind, hilft die Methode flatMap() dabei, diese zu einem einzelnen Stream zu vereinigen, was die weitere Verarbeitung erleichtert. Zum Beispiel kann ein Array, das andere Arrays enthält, zu einem einzigen Array kombiniert werden.

Beispiel

Es gibt mehrere Produktionslinien, von denen jede mehrere Produkte herstellt. Ziel ist es, eine einzelne Liste aller Produkte zu erhalten, die über diese Linien hinweg produziert wurden.

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); } }

Dieser Code verwendet flatMap(), um verschachtelte Listen von Produkten aus verschiedenen Produktionslinien zu einer einheitlichen Stream zusammenzuführen.

Jede Produktionslinie, dargestellt als Liste von Produkten, wird in einen Stream von Elementen umgewandelt, der anschließend mit toList() in eine abschließende Liste gesammelt wird. Das Ergebnis ist eine einzelne Liste, die alle in der Fabrik hergestellten Produkte enthält.

1. Was bewirkt die Methode flatMap() in der Stream-API?

2. Was passiert bei der Verwendung von flatMap() mit verschachtelten Kollektionen?

question mark

Was bewirkt die Methode flatMap() in der Stream-API?

Select the correct answer

question mark

Was passiert bei der Verwendung von flatMap() mit verschachtelten Kollektionen?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

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

bookArbeiten mit Verschachtelten Strukturen mit der flatMap()-Methode

Swipe um das Menü anzuzeigen

Beim Arbeiten mit Datensammlungen in Java trifft man häufig auf Situationen, in denen unsere Strukturen verschachtelt sind. Zum Beispiel kann es eine Liste von Objekten geben, von denen jedes eine weitere Liste von Objekten enthält.

In solchen Fällen sind Standardoperationen wie map() nicht geeignet, um alle verschachtelten Daten in einem einzigen Stream zu extrahieren. Hier kommt die Methode flatMap() aus der Stream API zum Einsatz.

Die Methode flatMap() nimmt eine Funktion entgegen, die jedes Element des Streams in einen neuen Stream umwandelt.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — der Typ der Elemente im resultierenden Stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — eine Funktion, die ein Element aus dem ursprünglichen Stream (T) entgegennimmt und einen Stream (Stream<R>) der resultierenden Elemente zurückgibt.

Es ist wichtig zu verstehen, dass flatMap() nicht einfach ein neues Element zurückgibt, sondern für jedes Element einen Stream (oder eine andere Collection). Diese einzelnen Streams werden dann zu einem einzigen kombiniert.

Praktische Anwendung

Stellen Sie sich vor, Sie haben mehrere Fabriken, die jeweils unterschiedliche Produkte herstellen. Unser Ziel ist es, eine einheitliche Liste aller Produkte dieser Fabriken zu erstellen und deren Namen in Großbuchstaben umzuwandeln.

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; } }

Die factories Liste enthält mehrere Factory Objekte, von denen jedes einen name und eine Liste von products besitzt. Da getProducts() eine Liste zurückgibt, würde ein Aufruf von stream() auf factories normalerweise einen Stream von Factory Objekten liefern, was jedoch nicht benötigt wird.

Um die tatsächlichen Produktnamen zu extrahieren, wird flatMap(factory -> factory.getProducts().stream()) verwendet. Dies flattens alle Produktlisten zu einem einzelnen kontinuierlichen Stream von String-Werten.

Anschließend wendet map(String::toUpperCase) die Methode toUpperCase() auf jeden Produktnamen an, sodass alle Namen in Großbuchstaben vorliegen, bevor sie mit productList in toList() gesammelt werden.

Zusammenführen von Kollektionen zu einer

Wenn Daten als verschachtelte Kollektionen organisiert sind, hilft die Methode flatMap() dabei, diese zu einem einzelnen Stream zu vereinigen, was die weitere Verarbeitung erleichtert. Zum Beispiel kann ein Array, das andere Arrays enthält, zu einem einzigen Array kombiniert werden.

Beispiel

Es gibt mehrere Produktionslinien, von denen jede mehrere Produkte herstellt. Ziel ist es, eine einzelne Liste aller Produkte zu erhalten, die über diese Linien hinweg produziert wurden.

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); } }

Dieser Code verwendet flatMap(), um verschachtelte Listen von Produkten aus verschiedenen Produktionslinien zu einer einheitlichen Stream zusammenzuführen.

Jede Produktionslinie, dargestellt als Liste von Produkten, wird in einen Stream von Elementen umgewandelt, der anschließend mit toList() in eine abschließende Liste gesammelt wird. Das Ergebnis ist eine einzelne Liste, die alle in der Fabrik hergestellten Produkte enthält.

1. Was bewirkt die Methode flatMap() in der Stream-API?

2. Was passiert bei der Verwendung von flatMap() mit verschachtelten Kollektionen?

question mark

Was bewirkt die Methode flatMap() in der Stream-API?

Select the correct answer

question mark

Was passiert bei der Verwendung von flatMap() mit verschachtelten Kollektionen?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4
some-alt