0Pricing
Java Academy · Leçon

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")); // Germany

Gé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.COM

toUnmodifiableMap

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 UnsupportedOperationException

Collectors.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.0

summingInt 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.0

groupingBy 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")); // 5432

Vé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

  1. groupingBy : classer des éléments
  2. partitioningBy et comptage
  3. toMap, joining et summarizing
  4. Créer un collecteur personnalisé
← Retour à Java Academy