Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Arbejde med Indlejrede Strukturer med flatMap()-Metoden | Mellemliggende Operationer i Stream API
Stream API

bookArbejde med Indlejrede Strukturer med flatMap()-Metoden

Når du arbejder med datakollektioner i Java, støder du ofte på situationer, hvor vores strukturer er indlejrede. For eksempel kan du have en liste af objekter, hvor hvert objekt indeholder en anden liste af objekter.

I sådanne tilfælde er standardoperationer som map() ikke egnede til at udtrække alle indlejrede data i én enkelt stream. Det er her, flatMap()-metoden fra Stream API kommer ind i billedet.

Metoden flatMap() tager en funktion, der transformerer hvert element i streamen til en ny stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R>typen af elementer i den resulterende stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — en funktion, der tager et element fra den oprindelige stream (T) og returnerer en stream (Stream<R>) af resulterende elementer.

Det er vigtigt at forstå, at flatMap() ikke blot returnerer et nyt element, men derimod en stream (eller en anden samling) for hvert element. Disse individuelle streams kombineres derefter til én.

Praktisk anvendelse

Forestil dig, at du har flere fabrikker, som hver producerer forskellige typer produkter. Målet er at oprette en samlet liste over alle produkter fra disse fabrikker og konvertere deres navne til store bogstaver.

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

Listen factories indeholder flere Factory-objekter, som hver har et name og en liste af products. Da getProducts() returnerer en liste, vil et kald til stream()factories normalt give en stream af Factory-objekter, hvilket ikke er det ønskede.

For at udtrække de faktiske produktnavne bruges flatMap(factory -> factory.getProducts().stream()). Dette flader alle produktlister ud til én sammenhængende stream af String-værdier.

Derefter anvender map(String::toUpperCase) metoden toUpperCase() på hvert produktnavn, så alle navne er med store bogstaver, inden de samles i productList med toList().

Sammenlægning af kollektioner til én

Når data er organiseret som indlejrede kollektioner, hjælper flatMap()-metoden med at sammenlægge dem til én stream, hvilket gør videre behandling lettere. For eksempel kan du kombinere et array, der indeholder andre arrays, til et enkelt array.

Eksempel

Der er flere produktionslinjer, hvor hver fremstiller flere produkter. Målet er at opnå en samlet liste over alle produkter, der er produceret på disse linjer.

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

Denne kode anvender flatMap() til at sammenflette indlejrede lister af produkter fra forskellige produktionslinjer til én samlet stream.

Hver produktionslinje, repræsenteret som en liste af produkter, konverteres til en stream af elementer, som derefter samles i en endelig liste ved hjælp af toList(). Resultatet er en samlet liste, der indeholder alle produkter fremstillet på fabrikken.

1. Hvad gør flatMap()-metoden i Stream API'et?

2. Hvad sker der, når man bruger flatMap() med indlejrede samlinger?

question mark

Hvad gør flatMap()-metoden i Stream API'et?

Select the correct answer

question mark

Hvad sker der, når man bruger flatMap() med indlejrede samlinger?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 2.33

bookArbejde med Indlejrede Strukturer med flatMap()-Metoden

Stryg for at vise menuen

Når du arbejder med datakollektioner i Java, støder du ofte på situationer, hvor vores strukturer er indlejrede. For eksempel kan du have en liste af objekter, hvor hvert objekt indeholder en anden liste af objekter.

I sådanne tilfælde er standardoperationer som map() ikke egnede til at udtrække alle indlejrede data i én enkelt stream. Det er her, flatMap()-metoden fra Stream API kommer ind i billedet.

Metoden flatMap() tager en funktion, der transformerer hvert element i streamen til en ny stream.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R>typen af elementer i den resulterende stream;
  • Function<? super T, ? extends Stream<? extends R>> mapper — en funktion, der tager et element fra den oprindelige stream (T) og returnerer en stream (Stream<R>) af resulterende elementer.

Det er vigtigt at forstå, at flatMap() ikke blot returnerer et nyt element, men derimod en stream (eller en anden samling) for hvert element. Disse individuelle streams kombineres derefter til én.

Praktisk anvendelse

Forestil dig, at du har flere fabrikker, som hver producerer forskellige typer produkter. Målet er at oprette en samlet liste over alle produkter fra disse fabrikker og konvertere deres navne til store bogstaver.

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

Listen factories indeholder flere Factory-objekter, som hver har et name og en liste af products. Da getProducts() returnerer en liste, vil et kald til stream()factories normalt give en stream af Factory-objekter, hvilket ikke er det ønskede.

For at udtrække de faktiske produktnavne bruges flatMap(factory -> factory.getProducts().stream()). Dette flader alle produktlister ud til én sammenhængende stream af String-værdier.

Derefter anvender map(String::toUpperCase) metoden toUpperCase() på hvert produktnavn, så alle navne er med store bogstaver, inden de samles i productList med toList().

Sammenlægning af kollektioner til én

Når data er organiseret som indlejrede kollektioner, hjælper flatMap()-metoden med at sammenlægge dem til én stream, hvilket gør videre behandling lettere. For eksempel kan du kombinere et array, der indeholder andre arrays, til et enkelt array.

Eksempel

Der er flere produktionslinjer, hvor hver fremstiller flere produkter. Målet er at opnå en samlet liste over alle produkter, der er produceret på disse linjer.

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

Denne kode anvender flatMap() til at sammenflette indlejrede lister af produkter fra forskellige produktionslinjer til én samlet stream.

Hver produktionslinje, repræsenteret som en liste af produkter, konverteres til en stream af elementer, som derefter samles i en endelig liste ved hjælp af toList(). Resultatet er en samlet liste, der indeholder alle produkter fremstillet på fabrikken.

1. Hvad gør flatMap()-metoden i Stream API'et?

2. Hvad sker der, når man bruger flatMap() med indlejrede samlinger?

question mark

Hvad gør flatMap()-metoden i Stream API'et?

Select the correct answer

question mark

Hvad sker der, når man bruger flatMap() med indlejrede samlinger?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 4
some-alt