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 | Section
Practice
Projects
Quizzes & Challenges
Quizzer
Challenges
/
Stream API i Java

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 strukturerne 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. Her kommer flatMap()-metoden fra Stream API 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 anvendes 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().

Sammenfletning af kollektioner til én

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

Eksempel

Du har flere produktionslinjer, hvor hver fremstiller flere produkter. Målet er at opnå en enkelt liste over alle produkter, der er fremstillet 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 en 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 enkelt 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 1. Kapitel 19

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

Sektion 1. Kapitel 19
some-alt