Java Academy · Les

groupingBy: elementen classificeren

Groepeer stream-elementen in maps met een classifierfunctie en combineer deze met downstream-collectors.

Les 1 van 413 stappen

groupingBy: elementen classificeren is een gratis Java Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Wat is groupingBy?

Collectors.groupingBy() verdeelt elementen uit een stream over een Map, waarbij elke sleutel verwijst naar een lijst met overeenkomende elementen. Dit is het stream-equivalent van GROUP BY in SQL.

import java.util.*;
import java.util.stream.*;

record Person(String name, String city) {}
List<Person> people = List.of(
    new Person("Alice","NYC"), new Person("Bob","LA"),
    new Person("Carol","NYC"), new Person("Dave","LA"),
    new Person("Eve","Chicago")
);

Map<String, List<Person>> byCity =
    people.stream().collect(Collectors.groupingBy(Person::city));
byCity.forEach((city, ps) -> System.out.println(city + ": " + ps.size()));

Onderliggende verzamelaar: counting

Combineer groupingBy met een onderliggende verzamelaar om te aggregeren in plaats van elementen op te sommen:

Map<String, Long> countByCity =
    people.stream().collect(
        Collectors.groupingBy(Person::city, Collectors.counting())
    );
countByCity.forEach((city, n) -> System.out.println(city + " -> " + n));
// NYC -> 2, LA -> 2, Chicago -> 1

Onderliggende verzamelaar: mapping

Gebruik Collectors.mapping() als onderliggende verzamelaar om elementen te transformeren voordat je ze verzamelt:

Map<String, List<String>> namesByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.toList())
        )
    );
namesByCity.forEach((city, names) -> System.out.println(city + ": " + names));

Onderliggende verzamelaar: joining

Voeg namen per groep samen tot één tekenreeks met komma's als scheidingstekens:

Map<String, String> joinedByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.joining(", "))
        )
    );
joinedByCity.forEach((city, s) -> System.out.println(city + ": " + s));
// NYC: Alice, Carol

GroupingBy op meerdere niveaus

Leg aanroepen van groupingBy in elkaar voor classificatie in meerdere dimensies:

record Employee(String name, String dept, String level) {}
List<Employee> emps = List.of(
    new Employee("A","Eng","Junior"), new Employee("B","Eng","Senior"),
    new Employee("C","HR","Junior"), new Employee("D","HR","Senior")
);

Map<String, Map<String, List<Employee>>> grouped =
    emps.stream().collect(
        Collectors.groupingBy(Employee::dept,
            Collectors.groupingBy(Employee::level))
    );
grouped.forEach((dept, levels) -> levels.forEach((level, list) ->
    System.out.println(dept+"/"+level+": "+list.size())));

Het type Map beheren

Standaard maakt groupingBy een HashMap. Gebruik de overbelasting met drie argumenten om een ander type map op te geven, zoals TreeMap voor gesorteerde sleutels:

Map<String, Long> sorted =
    people.stream().collect(
        Collectors.groupingBy(Person::city, TreeMap::new, Collectors.counting())
    );
System.out.println(sorted); // keys in alphabetical order

Onderliggende verzamelaar: averagingInt

Bereken gemiddelden per groep:

record Product(String category, int price) {}
List<Product> products = List.of(
    new Product("A",10), new Product("A",20),
    new Product("B",15), new Product("B",25)
);

Map<String, Double> avgPrice =
    products.stream().collect(
        Collectors.groupingBy(Product::category,
            Collectors.averagingInt(Product::price))
    );
avgPrice.forEach((cat, avg) -> System.out.printf("%s: %.1f%n", cat, avg));

Onderliggende verzamelaar: toUnmodifiableList

Gebruik Collectors.toUnmodifiableList() als onderliggende verzamelaar om onveranderlijke groepen te maken:

Map<String, List<String>> immutable =
    people.stream().collect(
        Collectors.groupingBy(Person::city,
            Collectors.mapping(Person::name, Collectors.toUnmodifiableList()))
    );
// Attempting to modify throws UnsupportedOperationException

Praktijkvoorbeeld: bestellingsoverzicht

Groepeer bestellingen op status en tel de bedragen per groep bij elkaar op:

record Order(String status, double amount) {}
List<Order> orders = List.of(
    new Order("PAID", 50.0), new Order("PENDING", 30.0),
    new Order("PAID", 75.0), new Order("CANCELLED", 20.0)
);

Map<String, Double> totalByStatus =
    orders.stream().collect(
        Collectors.groupingBy(Order::status,
            Collectors.summingDouble(Order::amount))
    );
totalByStatus.forEach((s, t) -> System.out.printf("%s: $%.2f%n", s, t));

Prestatieoverwegingen

groupingBy verzamelt alle elementen in het geheugen. Overweeg bij zeer grote gegevensverzamelingen om de verwerking in blokken uit te voeren of een GROUP BY op databaseniveau te gebruiken. De onderliggende verzamelaar wordt voor elk element uitgevoerd — houd deze licht om gedrag van O(n²) te voorkomen.

Combineren met filter en sorted

Koppel streambewerkingen vóór het verzamelen om gegevens vooraf te filteren of te sorteren:

Map<String, Long> activeCities =
    people.stream()
          .filter(p -> !p.city().equals("Chicago"))
          .collect(Collectors.groupingBy(Person::city, Collectors.counting()));
System.out.println(activeCities); // {NYC=2, LA=2}

Korte controle

Welk type levert Collectors.groupingBy(Person::city) op wanneer je het met collect() gebruikt?

Samenvatting: groupingBy

Belangrijkste punten:

  • groupingBy(classifier) → Map<K, List<T>>
  • Combineer met onderliggende verzamelaars: counting, mapping, joining en summarizing
  • Leg groupingBy-aanroepen in elkaar voor classificatie in meerdere dimensies
  • Gebruik de overbelasting met drie argumenten om het type van de resulterende map te beheren (bijvoorbeeld TreeMap)
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “groupingBy: elementen classificeren” gratis?

Ja — de volledige tekst van “groupingBy: elementen classificeren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “groupingBy: elementen classificeren”?

Groepeer stream-elementen in maps met een classifierfunctie en combineer deze met downstream-collectors. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “groupingBy: elementen classificeren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. groupingBy: elementen classificeren
  2. partitioningBy en counting
  3. toMap, joining en samenvatten
  4. Een aangepaste collector bouwen
← Terug naar Java Academy