Classe Utilitaire Collectors pour l'API Stream
La méthode collect() dans l’API Stream est déjà connue comme un outil puissant pour rassembler les éléments d’un flux dans des structures de données pratiques. Cependant, collect() nécessite une implémentation de Collector, ce qui peut rendre le processus plus complexe.
C’est ici que la classe Collectors devient utile, en fournissant un ensemble d’implémentations prédéfinies pour les opérations les plus courantes. Elle simplifie des tâches telles que la collecte de données dans des collections, le groupement et le comptage, rendant ces opérations beaucoup plus directes.
Principales méthodes de la classe Collectors
La classe Collectors propose de nombreuses solutions prêtes à l’emploi, éliminant la nécessité d’implémenter manuellement un Collector. Voici quelques-unes des méthodes principales :
L’API Stream propose également la méthode intégrée toList(), que vous avez déjà utilisée. Cette méthode possède une syntaxe concise, ce qui en fait notre choix privilégié. Cependant, il est possible d’utiliser toute implémentation qui correspond le mieux à vos besoins.
Conversion d'une liste en une carte
Supposons que vous disposiez d'une liste de produits avec leurs prix, stockés sous forme de chaînes de caractères au format Name=Price. L'objectif est de créer une Map où la clé correspond au nom du produit et la valeur à son prix.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
Ici, la méthode toMap() est utilisée pour diviser chaque chaîne (split("=")) et créer une Map<String, Integer>, où la clé correspond au nom du produit et la valeur à son prix sous forme d'entier. Par exemple, la chaîne Laptop=1500 devient une entrée Laptop -> 1500.
Regroupement des produits par première lettre
Regroupons les produits selon leur première lettre afin d’identifier les articles commençant par la même lettre.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
Le programme crée une List de noms de produits et les regroupe par leur première lettre à l’aide de groupingBy(). Le résultat est stocké dans une Map, où la clé correspond à charAt(0) et la valeur à une liste des produits correspondants. Enfin, les produits regroupés sont affichés.
Séparation des prix
Collectors.partitioningBy est un collecteur spécial dans la Stream API qui divise les éléments en deux groupes selon un prédicat donné.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Il retourne une Map<Boolean, List<T>>, où true représente les éléments qui satisfont la condition, et false ceux qui ne la satisfont pas.
Cette méthode est utile pour séparer des données, comme filtrer les nombres pairs et impairs ou les produits à prix élevé et à bas prix.
Exemple
Séparation des prix des produits en deux catégories : chers (supérieurs à 1000 $) et bon marché (1000 $ ou moins).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
La méthode partitioningBy() divise la liste des prix en deux groupes. Si un prix est supérieur à 1000, il est placé sous la clé true ; sinon, il est placé sous false.
Comptage des produits
Détermination du nombre de produits commençant par la même lettre.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
Le programme traite la List de produits en utilisant stream(), puis applique groupingBy() avec charAt(0) pour regrouper les mots selon leur première lettre. Le collecteur counting() compte combien de produits appartiennent à chaque groupe, et la Map finale stocke la lettre comme clé et le nombre comme valeur.
Fusion des noms de produits
Concaténation des noms de produits en une seule chaîne de caractères, séparés par des virgules.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
La méthode Collectors.joining(", ") concatène tous les noms de produits en une seule chaîne de caractères, en les séparant par des virgules. Enfin, la chaîne résultante est affichée afin de présenter la liste des produits dans un format lisible.
1. Que fait le code suivant ?
2. Quelle méthode de Collectors doit être utilisée pour regrouper les produits selon leur première lettre ?
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
Classe Utilitaire Collectors pour l'API Stream
Glissez pour afficher le menu
La méthode collect() dans l’API Stream est déjà connue comme un outil puissant pour rassembler les éléments d’un flux dans des structures de données pratiques. Cependant, collect() nécessite une implémentation de Collector, ce qui peut rendre le processus plus complexe.
C’est ici que la classe Collectors devient utile, en fournissant un ensemble d’implémentations prédéfinies pour les opérations les plus courantes. Elle simplifie des tâches telles que la collecte de données dans des collections, le groupement et le comptage, rendant ces opérations beaucoup plus directes.
Principales méthodes de la classe Collectors
La classe Collectors propose de nombreuses solutions prêtes à l’emploi, éliminant la nécessité d’implémenter manuellement un Collector. Voici quelques-unes des méthodes principales :
L’API Stream propose également la méthode intégrée toList(), que vous avez déjà utilisée. Cette méthode possède une syntaxe concise, ce qui en fait notre choix privilégié. Cependant, il est possible d’utiliser toute implémentation qui correspond le mieux à vos besoins.
Conversion d'une liste en une carte
Supposons que vous disposiez d'une liste de produits avec leurs prix, stockés sous forme de chaînes de caractères au format Name=Price. L'objectif est de créer une Map où la clé correspond au nom du produit et la valeur à son prix.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
Ici, la méthode toMap() est utilisée pour diviser chaque chaîne (split("=")) et créer une Map<String, Integer>, où la clé correspond au nom du produit et la valeur à son prix sous forme d'entier. Par exemple, la chaîne Laptop=1500 devient une entrée Laptop -> 1500.
Regroupement des produits par première lettre
Regroupons les produits selon leur première lettre afin d’identifier les articles commençant par la même lettre.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
Le programme crée une List de noms de produits et les regroupe par leur première lettre à l’aide de groupingBy(). Le résultat est stocké dans une Map, où la clé correspond à charAt(0) et la valeur à une liste des produits correspondants. Enfin, les produits regroupés sont affichés.
Séparation des prix
Collectors.partitioningBy est un collecteur spécial dans la Stream API qui divise les éléments en deux groupes selon un prédicat donné.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Il retourne une Map<Boolean, List<T>>, où true représente les éléments qui satisfont la condition, et false ceux qui ne la satisfont pas.
Cette méthode est utile pour séparer des données, comme filtrer les nombres pairs et impairs ou les produits à prix élevé et à bas prix.
Exemple
Séparation des prix des produits en deux catégories : chers (supérieurs à 1000 $) et bon marché (1000 $ ou moins).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
La méthode partitioningBy() divise la liste des prix en deux groupes. Si un prix est supérieur à 1000, il est placé sous la clé true ; sinon, il est placé sous false.
Comptage des produits
Détermination du nombre de produits commençant par la même lettre.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
Le programme traite la List de produits en utilisant stream(), puis applique groupingBy() avec charAt(0) pour regrouper les mots selon leur première lettre. Le collecteur counting() compte combien de produits appartiennent à chaque groupe, et la Map finale stocke la lettre comme clé et le nombre comme valeur.
Fusion des noms de produits
Concaténation des noms de produits en une seule chaîne de caractères, séparés par des virgules.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
La méthode Collectors.joining(", ") concatène tous les noms de produits en une seule chaîne de caractères, en les séparant par des virgules. Enfin, la chaîne résultante est affichée afin de présenter la liste des produits dans un format lisible.
1. Que fait le code suivant ?
2. Quelle méthode de Collectors doit être utilisée pour regrouper les produits selon leur première lettre ?
Merci pour vos commentaires !