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

bookArbeide med Nestede Strukturer med flatMap()-Metoden

Når du arbeider med datasamlinger i Java, støter du ofte på situasjoner der strukturene er nestede. For eksempel kan du ha en liste med objekter, der hvert objekt inneholder en annen liste med objekter.

I slike tilfeller er standardoperasjoner som map() ikke egnet for å hente ut all nested data i én enkelt strøm. Det er her flatMap()-metoden fra Stream API kommer inn.

Metoden flatMap() tar en funksjon som transformerer hvert element i strømmen til en ny strøm.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R>typen til elementene i den resulterende strømmen;
  • Function<? super T, ? extends Stream<? extends R>> mapper — en funksjon som tar et element fra den opprinnelige strømmen (T) og returnerer en strøm (Stream<R>) av resulterende elementer.

Det er viktig å forstå at flatMap() ikke bare returnerer et nytt element, men snarere en strøm (eller en annen samling) for hvert element. Disse individuelle strømmene kombineres deretter til én.

Praktisk anvendelse

Tenk deg at du har flere fabrikker, hver med ulike typer produkter. Målet vårt er å lage en samlet liste over alle produktene fra disse fabrikkene og konvertere navnene deres til store bokstaver.

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 inneholder flere Factory-objekter, hvor hvert objekt har et name og en liste over products. Siden getProducts() returnerer en liste, vil et kall til stream()factories normalt gi en strøm av Factory-objekter, noe som ikke er ønsket.

For å hente ut de faktiske produktnavnene brukes flatMap(factory -> factory.getProducts().stream()). Dette flater ut alle produktlistene til én sammenhengende strøm av String-verdier.

Deretter bruker map(String::toUpperCase) metoden toUpperCase() på hvert produktnavn, slik at alle navnene blir store bokstaver før de samles i productList med toList().

Slå sammen samlinger til én

Når data er organisert som nestede samlinger, hjelper flatMap()-metoden med å slå dem sammen til én strøm, noe som gjør videre behandling enklere. For eksempel kan du kombinere et array som inneholder andre arrays til ett enkelt array.

Eksempel

Du har flere produksjonslinjer, hvor hver produserer flere produkter. Målet er å få en enkel liste over alle produkter produsert på disse linjene.

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 koden bruker flatMap() for å slå sammen nøstede lister med produkter fra ulike produksjonslinjer til en samlet strøm.

Hver produksjonslinje, representert som en liste med produkter, konverteres til en strøm av elementer, som deretter samles i en sluttliste ved hjelp av toList(). Resultatet er en enkel liste som inneholder alle produkter produsert i fabrikken.

1. Hva gjør metoden flatMap() i Stream API?

2. Hva skjer når man bruker flatMap() med nestede samlinger?

question mark

Hva gjør metoden flatMap() i Stream API?

Select the correct answer

question mark

Hva skjer når man bruker flatMap() med nestede samlinger?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 2.33

bookArbeide med Nestede Strukturer med flatMap()-Metoden

Sveip for å vise menyen

Når du arbeider med datasamlinger i Java, støter du ofte på situasjoner der strukturene er nestede. For eksempel kan du ha en liste med objekter, der hvert objekt inneholder en annen liste med objekter.

I slike tilfeller er standardoperasjoner som map() ikke egnet for å hente ut all nested data i én enkelt strøm. Det er her flatMap()-metoden fra Stream API kommer inn.

Metoden flatMap() tar en funksjon som transformerer hvert element i strømmen til en ny strøm.

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
  • <R>typen til elementene i den resulterende strømmen;
  • Function<? super T, ? extends Stream<? extends R>> mapper — en funksjon som tar et element fra den opprinnelige strømmen (T) og returnerer en strøm (Stream<R>) av resulterende elementer.

Det er viktig å forstå at flatMap() ikke bare returnerer et nytt element, men snarere en strøm (eller en annen samling) for hvert element. Disse individuelle strømmene kombineres deretter til én.

Praktisk anvendelse

Tenk deg at du har flere fabrikker, hver med ulike typer produkter. Målet vårt er å lage en samlet liste over alle produktene fra disse fabrikkene og konvertere navnene deres til store bokstaver.

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 inneholder flere Factory-objekter, hvor hvert objekt har et name og en liste over products. Siden getProducts() returnerer en liste, vil et kall til stream()factories normalt gi en strøm av Factory-objekter, noe som ikke er ønsket.

For å hente ut de faktiske produktnavnene brukes flatMap(factory -> factory.getProducts().stream()). Dette flater ut alle produktlistene til én sammenhengende strøm av String-verdier.

Deretter bruker map(String::toUpperCase) metoden toUpperCase() på hvert produktnavn, slik at alle navnene blir store bokstaver før de samles i productList med toList().

Slå sammen samlinger til én

Når data er organisert som nestede samlinger, hjelper flatMap()-metoden med å slå dem sammen til én strøm, noe som gjør videre behandling enklere. For eksempel kan du kombinere et array som inneholder andre arrays til ett enkelt array.

Eksempel

Du har flere produksjonslinjer, hvor hver produserer flere produkter. Målet er å få en enkel liste over alle produkter produsert på disse linjene.

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 koden bruker flatMap() for å slå sammen nøstede lister med produkter fra ulike produksjonslinjer til en samlet strøm.

Hver produksjonslinje, representert som en liste med produkter, konverteres til en strøm av elementer, som deretter samles i en sluttliste ved hjelp av toList(). Resultatet er en enkel liste som inneholder alle produkter produsert i fabrikken.

1. Hva gjør metoden flatMap() i Stream API?

2. Hva skjer når man bruker flatMap() med nestede samlinger?

question mark

Hva gjør metoden flatMap() i Stream API?

Select the correct answer

question mark

Hva skjer når man bruker flatMap() med nestede samlinger?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4
some-alt