Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Werken met Geneste Structuren met de flatMap()-Methode | Intermediaire Bewerkingen in Stream API
Stream-API

bookWerken met Geneste Structuren met de flatMap()-Methode

Bij het werken met gegevensverzamelingen in Java kom je vaak situaties tegen waarin onze structuren genest zijn. Bijvoorbeeld, je kunt een lijst van objecten hebben, waarbij elk object een andere lijst van objecten bevat.

In dergelijke gevallen zijn standaardbewerkingen zoals map() niet geschikt om alle geneste gegevens in één enkele stream te extraheren. Hiervoor wordt de flatMap()-methode uit de Stream API gebruikt.

De flatMap()-methode accepteert een functie die elk element van de stream transformeert naar een nieuwe stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — het type van elementen in de resulterende stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — een functie die een element uit de oorspronkelijke stream (T) neemt en een stream (Stream<R>) van resulterende elementen retourneert.

Het is belangrijk te begrijpen dat flatMap() niet eenvoudigweg een nieuw element retourneert, maar eerder een stream (of een andere collectie) voor elk element. Deze individuele streams worden vervolgens gecombineerd tot één.

Praktische Toepassing

Stel je hebt meerdere fabrieken, die elk verschillende soorten producten produceren. Ons doel is om een uniforme lijst van alle producten uit deze fabrieken te maken en hun namen om te zetten naar hoofdletters.

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

De lijst factories bevat meerdere Factory-objecten, elk met een name en een lijst van products. Omdat getProducts() een lijst retourneert, levert het aanroepen van stream() op factories normaal gesproken een stream van Factory-objecten op, wat niet gewenst is.

Om de daadwerkelijke productnamen te verkrijgen, gebruik je flatMap(factory -> factory.getProducts().stream()). Hiermee worden alle productlijsten geflat tot één doorlopende stream van String-waarden.

Vervolgens past map(String::toUpperCase) de methode toUpperCase() toe op elke productnaam, zodat alle namen in hoofdletters staan voordat ze worden verzameld in productList met behulp van toList().

Collecties samenvoegen tot één

Wanneer gegevens zijn georganiseerd als geneste collecties, helpt de methode flatMap() om deze te samenvoegen tot één enkele stream, waardoor verdere verwerking eenvoudiger wordt. Bijvoorbeeld, je kunt een array die andere arrays bevat combineren tot één enkele array.

Voorbeeld

Er zijn meerdere productielijnen, die elk verschillende producten produceren. Het doel is om een enkele lijst te verkrijgen van alle producten die op deze lijnen zijn geproduceerd.

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

Deze code gebruikt flatMap() om geneste lijsten van producten uit verschillende productielijnen samen te voegen tot één samengestelde stream.

Elke productielijn, weergegeven als een lijst van producten, wordt omgezet in een stream van elementen, die vervolgens wordt verzameld in een definitieve lijst met behulp van toList(). Het resultaat is een enkele lijst met alle producten die in de fabriek zijn geproduceerd.

1. Wat doet de methode flatMap() in de Stream API?

2. Wat gebeurt er bij het gebruik van flatMap() met geneste collecties?

question mark

Wat doet de methode flatMap() in de Stream API?

Select the correct answer

question mark

Wat gebeurt er bij het gebruik van flatMap() met geneste collecties?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 4

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 2.33

bookWerken met Geneste Structuren met de flatMap()-Methode

Veeg om het menu te tonen

Bij het werken met gegevensverzamelingen in Java kom je vaak situaties tegen waarin onze structuren genest zijn. Bijvoorbeeld, je kunt een lijst van objecten hebben, waarbij elk object een andere lijst van objecten bevat.

In dergelijke gevallen zijn standaardbewerkingen zoals map() niet geschikt om alle geneste gegevens in één enkele stream te extraheren. Hiervoor wordt de flatMap()-methode uit de Stream API gebruikt.

De flatMap()-methode accepteert een functie die elk element van de stream transformeert naar een nieuwe stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R> — het type van elementen in de resulterende stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — een functie die een element uit de oorspronkelijke stream (T) neemt en een stream (Stream<R>) van resulterende elementen retourneert.

Het is belangrijk te begrijpen dat flatMap() niet eenvoudigweg een nieuw element retourneert, maar eerder een stream (of een andere collectie) voor elk element. Deze individuele streams worden vervolgens gecombineerd tot één.

Praktische Toepassing

Stel je hebt meerdere fabrieken, die elk verschillende soorten producten produceren. Ons doel is om een uniforme lijst van alle producten uit deze fabrieken te maken en hun namen om te zetten naar hoofdletters.

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

De lijst factories bevat meerdere Factory-objecten, elk met een name en een lijst van products. Omdat getProducts() een lijst retourneert, levert het aanroepen van stream() op factories normaal gesproken een stream van Factory-objecten op, wat niet gewenst is.

Om de daadwerkelijke productnamen te verkrijgen, gebruik je flatMap(factory -> factory.getProducts().stream()). Hiermee worden alle productlijsten geflat tot één doorlopende stream van String-waarden.

Vervolgens past map(String::toUpperCase) de methode toUpperCase() toe op elke productnaam, zodat alle namen in hoofdletters staan voordat ze worden verzameld in productList met behulp van toList().

Collecties samenvoegen tot één

Wanneer gegevens zijn georganiseerd als geneste collecties, helpt de methode flatMap() om deze te samenvoegen tot één enkele stream, waardoor verdere verwerking eenvoudiger wordt. Bijvoorbeeld, je kunt een array die andere arrays bevat combineren tot één enkele array.

Voorbeeld

Er zijn meerdere productielijnen, die elk verschillende producten produceren. Het doel is om een enkele lijst te verkrijgen van alle producten die op deze lijnen zijn geproduceerd.

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

Deze code gebruikt flatMap() om geneste lijsten van producten uit verschillende productielijnen samen te voegen tot één samengestelde stream.

Elke productielijn, weergegeven als een lijst van producten, wordt omgezet in een stream van elementen, die vervolgens wordt verzameld in een definitieve lijst met behulp van toList(). Het resultaat is een enkele lijst met alle producten die in de fabriek zijn geproduceerd.

1. Wat doet de methode flatMap() in de Stream API?

2. Wat gebeurt er bij het gebruik van flatMap() met geneste collecties?

question mark

Wat doet de methode flatMap() in de Stream API?

Select the correct answer

question mark

Wat gebeurt er bij het gebruik van flatMap() met geneste collecties?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 4
some-alt