Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Travail Avec des Structures Imbriquées Avec la Méthode flatMap() | Opérations Intermédiaires dans l'API Stream
API Stream

bookTravail 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

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

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

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

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 ?

question mark

Que fait la méthode flatMap() dans l'API Stream ?

Select the correct answer

question mark

Que se passe-t-il lors de l'utilisation de flatMap() avec des collections imbriquées ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 4

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

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

bookTravail 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

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

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

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

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 ?

question mark

Que fait la méthode flatMap() dans l'API Stream ?

Select the correct answer

question mark

Que se passe-t-il lors de l'utilisation de flatMap() avec des collections imbriquées ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 4
some-alt