Travail Avec des Structures Imbriquées Avec la Méthode flatMap()
Lors de la manipulation de collections de données en Java, il est fréquent de rencontrer des situations où les structures sont imbriquées. Par exemple, il peut s'agir d'une liste d'objets, chacun contenant une autre liste d'objets.
Dans de tels cas, les opérations standard comme map() ne conviennent pas pour extraire toutes les données imbriquées en un seul flux. C'est ici que la méthode flatMap() de la Stream API intervient.
La méthode flatMap() prend une fonction qui transforme chaque élément du flux en un nouveau flux.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— le type des éléments dans le flux résultant ;Function<? super T, ? extends Stream<? extends R>> mapper— une fonction qui prend un élément du flux d'origine (T) et retourne un flux (Stream<R>) d'éléments résultants.
Il est important de comprendre que flatMap() ne retourne pas simplement un nouvel élément, mais plutôt un flux (ou une autre collection) pour chaque élément. Ces flux individuels sont ensuite combinés en un seul.
Application pratique
Supposons que vous disposiez de plusieurs usines, chacune produisant différents types de produits. L'objectif est de créer une liste unifiée de tous les produits issus de ces usines et de convertir leurs noms en majuscules.
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; } }
La liste factories contient plusieurs objets Factory, chacun possédant un name et une liste de products. Puisque getProducts() retourne une liste, l'appel de stream() sur factories fournirait normalement un flux d'objets Factory, ce qui n'est pas l'objectif recherché.
Pour extraire les véritables noms de produits, il faut utiliser flatMap(factory -> factory.getProducts().stream()). Cette opération aplatit toutes les listes de produits en un flux continu unique de valeurs de type String.
Ensuite, map(String::toUpperCase) applique la méthode toUpperCase() à chaque nom de produit, garantissant que tous les noms soient en majuscules avant de les collecter dans productList à l'aide de toList().
Fusionner des collections en une seule
Lorsque les données sont organisées sous forme de collections imbriquées, la méthode flatMap() permet de les fusionner en un flux unique, ce qui facilite le traitement ultérieur. Par exemple, il est possible de combiner un tableau contenant d'autres tableaux en un seul tableau.
Exemple
Plusieurs lignes de production existent, chacune fabriquant plusieurs produits. L'objectif est d'obtenir une liste unique de tous les produits fabriqués sur ces lignes.
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); } }
Ce code utilise flatMap() pour fusionner des listes imbriquées de produits provenant de différentes lignes de production en un flux unifié.
Chaque ligne de production, représentée par une liste de produits, est convertie en un flux d'éléments, qui est ensuite collecté dans une liste finale à l'aide de toList(). Ainsi, une liste unique contenant tous les produits fabriqués dans l'usine est obtenue.
1. Que fait la méthode flatMap() dans l'API Stream ?
2. Que se passe-t-il lors de l'utilisation de flatMap() avec des collections imbriquées ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Awesome!
Completion rate improved to 2.33
Travail Avec des Structures Imbriquées Avec la Méthode flatMap()
Glissez pour afficher le menu
Lors de la manipulation de collections de données en Java, il est fréquent de rencontrer des situations où les structures sont imbriquées. Par exemple, il peut s'agir d'une liste d'objets, chacun contenant une autre liste d'objets.
Dans de tels cas, les opérations standard comme map() ne conviennent pas pour extraire toutes les données imbriquées en un seul flux. C'est ici que la méthode flatMap() de la Stream API intervient.
La méthode flatMap() prend une fonction qui transforme chaque élément du flux en un nouveau flux.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
<R>— le type des éléments dans le flux résultant ;Function<? super T, ? extends Stream<? extends R>> mapper— une fonction qui prend un élément du flux d'origine (T) et retourne un flux (Stream<R>) d'éléments résultants.
Il est important de comprendre que flatMap() ne retourne pas simplement un nouvel élément, mais plutôt un flux (ou une autre collection) pour chaque élément. Ces flux individuels sont ensuite combinés en un seul.
Application pratique
Supposons que vous disposiez de plusieurs usines, chacune produisant différents types de produits. L'objectif est de créer une liste unifiée de tous les produits issus de ces usines et de convertir leurs noms en majuscules.
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; } }
La liste factories contient plusieurs objets Factory, chacun possédant un name et une liste de products. Puisque getProducts() retourne une liste, l'appel de stream() sur factories fournirait normalement un flux d'objets Factory, ce qui n'est pas l'objectif recherché.
Pour extraire les véritables noms de produits, il faut utiliser flatMap(factory -> factory.getProducts().stream()). Cette opération aplatit toutes les listes de produits en un flux continu unique de valeurs de type String.
Ensuite, map(String::toUpperCase) applique la méthode toUpperCase() à chaque nom de produit, garantissant que tous les noms soient en majuscules avant de les collecter dans productList à l'aide de toList().
Fusionner des collections en une seule
Lorsque les données sont organisées sous forme de collections imbriquées, la méthode flatMap() permet de les fusionner en un flux unique, ce qui facilite le traitement ultérieur. Par exemple, il est possible de combiner un tableau contenant d'autres tableaux en un seul tableau.
Exemple
Plusieurs lignes de production existent, chacune fabriquant plusieurs produits. L'objectif est d'obtenir une liste unique de tous les produits fabriqués sur ces lignes.
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); } }
Ce code utilise flatMap() pour fusionner des listes imbriquées de produits provenant de différentes lignes de production en un flux unifié.
Chaque ligne de production, représentée par une liste de produits, est convertie en un flux d'éléments, qui est ensuite collecté dans une liste finale à l'aide de toList(). Ainsi, une liste unique contenant tous les produits fabriqués dans l'usine est obtenue.
1. Que fait la méthode flatMap() dans l'API Stream ?
2. Que se passe-t-il lors de l'utilisation de flatMap() avec des collections imbriquées ?
Merci pour vos commentaires !