toMap, joining et summarizing
Convertissez des flux en cartes, concaténez des chaînes avec joining et calculez des statistiques avec summarizingInt.
toMap, joining et summarizing est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Bases de Collectors.toMap
Collectors.toMap(keyMapper, valueMapper) convertit un stream en Map. Chaque élément fournit une paire clé-valeur.
import java.util.*;
import java.util.stream.*;
record Country(String code, String name) {}
List<Country> countries = List.of(
new Country("US","United States"),
new Country("DE","Germany"),
new Country("JP","Japan")
);
Map<String, String> codeToName =
countries.stream().collect(
Collectors.toMap(Country::code, Country::name)
);
System.out.println(codeToName.get("DE")); // GermanyGérer les clés en double
toMap lève une IllegalStateException lorsque des clés sont en double. Fournissez une fonction de fusion comme troisième argument pour résoudre les conflits :
List<String> words = List.of("apple","ant","banana","bat","cherry");
Map<Character, String> firstByLetter =
words.stream().collect(
Collectors.toMap(
w -> w.charAt(0),
w -> w,
(existing, replacement) -> existing // keep first
)
);
System.out.println(firstByLetter); // {a=apple, b=banana, c=cherry}toMap avec transformation des valeurs
Le valueMapper peut être n’importe quelle fonction : transformez l’élément avant de le stocker :
record User(String login, String email) {}
List<User> users = List.of(
new User("alice","alice@example.com"),
new User("bob","bob@example.com")
);
Map<String, String> loginToEmail =
users.stream().collect(
Collectors.toMap(User::login, u -> u.email().toUpperCase())
);
System.out.println(loginToEmail.get("alice")); // ALICE@EXAMPLE.COMtoUnmodifiableMap
Utilisez Collectors.toUnmodifiableMap() pour produire une carte immuable, ce qui équivaut à l’envelopper avec Collections.unmodifiableMap(), mais de manière plus claire :
Map<String, Integer> wordLengths =
Stream.of("Java","Stream","API")
.collect(Collectors.toUnmodifiableMap(w -> w, String::length));
// wordLengths.put("test",4); // throws UnsupportedOperationExceptionCollectors.joining
Collectors.joining() concatène les éléments de type chaîne. Il accepte facultativement un séparateur, un préfixe et un suffixe :
List<String> names = List.of("Alice","Bob","Carol");
System.out.println(names.stream().collect(Collectors.joining()));
// AliceBobCarol
System.out.println(names.stream().collect(Collectors.joining(", ")));
// Alice, Bob, Carol
System.out.println(names.stream().collect(Collectors.joining(", ", "[", "]")));
// [Alice, Bob, Carol]joining pour produire du CSV
Construisez des lignes CSV ou des clauses SQL IN avec joining :
List<Integer> ids = List.of(1,2,3,4,5);
String inClause = ids.stream()
.map(Object::toString)
.collect(Collectors.joining(",", "(", ")"));
System.out.println("WHERE id IN " + inClause);
// WHERE id IN (1,2,3,4,5)summarizingInt / Long / Double
Collectors.summarizingInt() calcule toutes les statistiques en un seul passage et renvoie un IntSummaryStatistics :
record Product(String name, int price) {}
List<Product> products = List.of(
new Product("A",100), new Product("B",200), new Product("C",150)
);
IntSummaryStatistics stats =
products.stream().collect(Collectors.summarizingInt(Product::price));
System.out.println("Count: " + stats.getCount()); // 3
System.out.println("Sum: " + stats.getSum()); // 450
System.out.println("Min: " + stats.getMin()); // 100
System.out.println("Max: " + stats.getMax()); // 200
System.out.println("Avg: " + stats.getAverage()); // 150.0summingInt et averagingInt
Pour les cas plus simples où vous n’avez besoin que d’une seule statistique :
int total = products.stream().collect(Collectors.summingInt(Product::price));
System.out.println("Total: " + total); // 450
double avg = products.stream().collect(Collectors.averagingInt(Product::price));
System.out.println("Average: " + avg); // 150.0groupingBy avec summarizingInt
Combinez le calcul de statistiques pour chaque groupe :
record Sale(String region, int amount) {}
List<Sale> sales = List.of(
new Sale("North",100), new Sale("South",200),
new Sale("North",150), new Sale("South",300)
);
Map<String, IntSummaryStatistics> statsByRegion =
sales.stream().collect(
Collectors.groupingBy(Sale::region,
Collectors.summarizingInt(Sale::amount))
);
statsByRegion.forEach((r,s) ->
System.out.printf("%s: sum=%d avg=%.1f%n", r, s.getSum(), s.getAverage()));Collecter dans une LinkedHashMap
Par défaut, toMap produit une HashMap, dont l’ordre n’est pas garanti. Utilisez la surcharge à quatre arguments pour spécifier une LinkedHashMap et préserver l’ordre d’insertion :
Map<String, Integer> ordered =
Stream.of("banana","apple","cherry")
.collect(Collectors.toMap(
w -> w,
String::length,
(a,b) -> a,
LinkedHashMap::new
));
System.out.println(ordered.keySet()); // [banana, apple, cherry]En pratique : analyseur de configuration
Analysez des lignes clé=valeur pour les convertir en carte avec toMap :
List<String> lines = List.of("host=localhost","port=5432","db=myapp");
Map<String, String> config =
lines.stream()
.map(l -> l.split("=", 2))
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
System.out.println(config.get("port")); // 5432Vérification rapide
Vous utilisez Collectors.toMap(k, v) sur un stream qui contient deux éléments possédant la même clé. Que se passe-t-il ?
Récapitulatif : toMap, joining, summarizing
Points essentiels :
- toMap(keyMapper, valueMapper) — lève une exception lorsque des clés sont en double, en l’absence de fonction de fusion
- joining(delimiter, prefix, suffix) — concatène élégamment les chaînes
- summarizingInt fournit le nombre, la somme, le minimum, le maximum et la moyenne en un seul passage
- summingInt/averagingInt répondent aux besoins portant sur une seule statistique
- Utilisez toMap à quatre arguments avec LinkedHashMap::new pour obtenir des résultats ordonnés
Questions Fréquemment Posées
La leçon « toMap, joining et summarizing » est-elle gratuite ?
Oui — le texte complet de « toMap, joining et summarizing » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « toMap, joining et summarizing » ?
Convertissez des flux en cartes, concaténez des chaînes avec joining et calculez des statistiques avec summarizingInt. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « toMap, joining et summarizing » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- groupingBy : classer des éléments
- partitioningBy et comptage
- toMap, joining et summarizing
- Créer un collecteur personnalisé