Java Funktionen zum Gruppieren von Listeneinträgen basierend auf Eigenschaften

Melden
  1. Verwendung der Stream-API und Collectors.groupingBy
  2. Beispiel
  3. Erweiterte Gruppierungsoptionen
  4. Alternative Methoden und Utilities
  5. Zusammenfassung

In Java werden Listeneinträge häufig basierend auf bestimmten Eigenschaften gruppiert, um die Datenstruktur übersichtlicher zu gestalten oder um Analysen durchzuführen. Seit Java 8 bieten die Stream-API und insbesondere die Funktion Collectors.groupingBy eine elegante und mächtige Möglichkeit, Elemente einer Liste zu gruppieren.

Verwendung der Stream-API und Collectors.groupingBy

Die zentrale Funktionalität zum Gruppieren von Listeneinträgen stellt der Collector Collectors.groupingBy bereit. Diese Methode wird oft in Verbindung mit Streams verwendet. Dabei wird die Liste zunächst in einen Stream überführt, und anschließend werden die Elemente anhand einer Funktion, die eine Gruppierungseigenschaft extrahiert, zugeordnet.

Der Rückgabewert von Collectors.groupingBy ist typischerweise eine Map, bei der der Schlüssel die Gruppierungseigenschaft und der Wert eine Liste aller Einträge mit dieser Eigenschaft ist.

Beispiel

Angenommen, es existiert eine Liste von Objekten der Klasse Person, die unter anderem ein Alter als Eigenschaft besitzt. Um die Personen nach ihrem Alter zu gruppieren, kann folgender Code genutzt werden:

Map<Integer, List<Person>> gruppiertNachAlter = personenListe.stream() .collect(Collectors.groupingBy(Person::getAlter));

Hierbei wird für jeden Person-Eintrag das Alter extrahiert (Person::getAlter) und als Schlüssel der Map genutzt. Die zugehörigen Personen werden als Liste im jeweiligen Wert gespeichert.

Erweiterte Gruppierungsoptionen

Die Methode Collectors.groupingBy ist sehr flexibel und erlaubt neben der einfachen Gruppierung nach einer Eigenschaft auch die Kombination mit weiteren Collectoren wie Collectors.counting(), um z.B. die Anzahl der Elemente pro Gruppe zu ermitteln, oder Verschachtelungen für mehrstufige Gruppierungen.

Zum Beispiel, um die Anzahl der Personen pro Alter zu erhalten, könnte der Code so aussehen:

Map<Integer, Long> anzahlProAlter = personenListe.stream() .collect(Collectors.groupingBy(Person::getAlter, Collectors.counting()));

Auch eine mehrstufige Gruppierung ist möglich, beispielsweise zuerst nach Alter und dann nach Geschlecht:

Map<Integer, Map<Geschlecht, List<Person>>> gruppierung = personenListe.stream() .collect(Collectors.groupingBy(Person::getAlter, Collectors.groupingBy(Person::getGeschlecht)) );

Alternative Methoden und Utilities

Vorausgesetzt, man möchte auf die Stream-API verzichten oder benötigt andere Lösungen, kann man auch traditionelle Schleifen verwenden, um Gruppen manuell aufzubauen. Allerdings führt dies meist zu umfangreicherem und fehleranfälligerem Code.

Darüber hinaus bieten Bibliotheken wie Google Guava mit Multimap oder Apache Commons Collections weitere Utilities zum einfachen Gruppieren von Einträgen an.

Zusammenfassung

Für das Gruppieren von Listeneinträgen basierend auf Eigenschaften sind in Java ab Version 8 vor allem die Funktionen der Stream-API und hier im Speziellen Collectors.groupingBy die empfehlenswerte Lösung. Sie ermöglichen eine prägnante und effiziente Umsetzung sowohl einfacher als auch komplexer Gruppierungsanforderungen.

0
0 Kommentare