groupingBy: elementen classificeren
Groepeer stream-elementen in maps met een classifierfunctie en combineer deze met downstream-collectors.
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 -> 1Onderliggende 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, CarolGroupingBy 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 orderOnderliggende 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 UnsupportedOperationExceptionPraktijkvoorbeeld: 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)
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
- groupingBy: elementen classificeren
- partitioningBy en counting
- toMap, joining en samenvatten
- Een aangepaste collector bouwen