Arbete med Nästlade Strukturer med flatMap()-Metoden
Vid arbete med datakollektioner i Java stöter du ofta på situationer där våra strukturer är nästlade. Till exempel kan du ha en lista av objekt, där varje objekt innehåller en annan lista av objekt.
I sådana fall är standardoperationer som map() inte lämpliga för att extrahera all nästlad data i en enda ström. Det är här metoden flatMap() från Stream API används.
Metoden flatMap() tar en funktion som omvandlar varje element i strömmen till en ny ström.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— typen av element i den resulterande strömmen;Function<? super T, ? extends Stream<? extends R>> mapper— en funktion som tar ett element från den ursprungliga strömmen (T) och returnerar en ström (Stream<R>) av resulterande element.
Det är viktigt att förstå att flatMap() inte bara returnerar ett nytt element utan snarare en ström (eller en annan samling) för varje element. Dessa individuella strömmar kombineras sedan till en.
Praktisk tillämpning
Föreställ dig att du har flera fabriker, som var och en producerar olika typer av produkter. Målet är att skapa en enhetlig lista över alla produkter från dessa fabriker och konvertera deras namn till versaler.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
Listan factories innehåller flera Factory-objekt, där varje objekt har ett name och en lista av products. Eftersom getProducts() returnerar en lista, skulle ett anrop på stream() för factories normalt ge en stream av Factory-objekt, vilket inte är det vi behöver.
För att extrahera de faktiska produktnamnen används flatMap(factory -> factory.getProducts().stream()). Detta plattar ut alla produktlistor till en enda sammanhängande stream av String-värden.
Därefter tillämpar map(String::toUpperCase) metoden toUpperCase() på varje produktnamn, vilket säkerställer att alla namn är i versaler innan de samlas i productList med hjälp av toList().
Slå samman samlingar till en
När data är organiserad som nästlade samlingar hjälper metoden flatMap() till att slå ihop dem till en enda stream, vilket gör vidare bearbetning enklare. Till exempel kan du kombinera en array som innehåller andra arrayer till en enda array.
Exempel
Du har flera produktionslinjer, där varje tillverkar flera produkter. Målet är att få en enda lista med alla produkter som produceras på dessa linjer.
Main.java
12345678910111213141516171819202122package 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); } }
Denna kod använder flatMap() för att sammanfoga nästlade listor av produkter från olika produktionslinjer till en enhetlig ström.
Varje produktionslinje, representerad som en lista av produkter, omvandlas till en ström av element, som sedan samlas i en slutlig lista med hjälp av toList(). Resultatet blir en enda lista som innehåller alla produkter tillverkade i fabriken.
1. Vad gör metoden flatMap() i Stream API?
2. Vad händer när man använder flatMap() med nästlade samlingar?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.33
Arbete med Nästlade Strukturer med flatMap()-Metoden
Svep för att visa menyn
Vid arbete med datakollektioner i Java stöter du ofta på situationer där våra strukturer är nästlade. Till exempel kan du ha en lista av objekt, där varje objekt innehåller en annan lista av objekt.
I sådana fall är standardoperationer som map() inte lämpliga för att extrahera all nästlad data i en enda ström. Det är här metoden flatMap() från Stream API används.
Metoden flatMap() tar en funktion som omvandlar varje element i strömmen till en ny ström.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— typen av element i den resulterande strömmen;Function<? super T, ? extends Stream<? extends R>> mapper— en funktion som tar ett element från den ursprungliga strömmen (T) och returnerar en ström (Stream<R>) av resulterande element.
Det är viktigt att förstå att flatMap() inte bara returnerar ett nytt element utan snarare en ström (eller en annan samling) för varje element. Dessa individuella strömmar kombineras sedan till en.
Praktisk tillämpning
Föreställ dig att du har flera fabriker, som var och en producerar olika typer av produkter. Målet är att skapa en enhetlig lista över alla produkter från dessa fabriker och konvertera deras namn till versaler.
Main.java
123456789101112131415161718192021222324252627282930313233343536package 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; } }
Listan factories innehåller flera Factory-objekt, där varje objekt har ett name och en lista av products. Eftersom getProducts() returnerar en lista, skulle ett anrop på stream() för factories normalt ge en stream av Factory-objekt, vilket inte är det vi behöver.
För att extrahera de faktiska produktnamnen används flatMap(factory -> factory.getProducts().stream()). Detta plattar ut alla produktlistor till en enda sammanhängande stream av String-värden.
Därefter tillämpar map(String::toUpperCase) metoden toUpperCase() på varje produktnamn, vilket säkerställer att alla namn är i versaler innan de samlas i productList med hjälp av toList().
Slå samman samlingar till en
När data är organiserad som nästlade samlingar hjälper metoden flatMap() till att slå ihop dem till en enda stream, vilket gör vidare bearbetning enklare. Till exempel kan du kombinera en array som innehåller andra arrayer till en enda array.
Exempel
Du har flera produktionslinjer, där varje tillverkar flera produkter. Målet är att få en enda lista med alla produkter som produceras på dessa linjer.
Main.java
12345678910111213141516171819202122package 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); } }
Denna kod använder flatMap() för att sammanfoga nästlade listor av produkter från olika produktionslinjer till en enhetlig ström.
Varje produktionslinje, representerad som en lista av produkter, omvandlas till en ström av element, som sedan samlas i en slutlig lista med hjälp av toList(). Resultatet blir en enda lista som innehåller alla produkter tillverkade i fabriken.
1. Vad gör metoden flatMap() i Stream API?
2. Vad händer när man använder flatMap() med nästlade samlingar?
Tack för dina kommentarer!