Heim > Java > javaLernprogramm > Hauptteil

Wie gruppiere ich verschachtelte Java 8-Objekte mithilfe von Collectors nach mehreren Schlüsseln?

DDD
Freigeben: 2024-10-24 08:38:02
Original
227 Leute haben es durchsucht

How to Group Java 8 Nested Objects by Multiple Keys Using Collectors?

Mehrstufige Gruppierung in Java 8 mit verschachtelten Kollektoren

Die mehrstufige Gruppierung, auch verschachtelte Gruppierung genannt, umfasst die Aggregation von Daten nach mehreren Schlüsseln über verschiedene Ebenen einer verschachtelten Objekthierarchie hinweg. In Java 8 können Sie dies mit Hilfe verschachtelter Collectors erreichen.

Stellen Sie sich ein Szenario vor, in dem Sie Klassen wie Pojo, Item und SubItem haben, wobei jedes Pojo eine Liste von Elementen hat und jedes Element eine Liste der Unterelemente. Das Ziel besteht darin, die Elemente nach ihrem Feld „key1“ zu gruppieren und für jede Gruppe die Unterelemente nach ihrem Feld „key2“ weiter zu aggregieren.

Um diese verschachtelte Gruppierung durchzuführen, können Sie Collectors.groupingBy mit einer verschachtelten Struktur verwenden:

<code class="java">pojo.getItems()
    .stream()
    .collect(
        Collectors.groupingBy(Item::getKey1, **// How to group by SubItem::getKey2 here**));</code>
Nach dem Login kopieren

Die Frage liegt im zweiten Parameter von Collectors.groupingBy – wie man die SubItems nach key2 innerhalb jeder key1-Gruppe gruppiert. Die Lösung kann kein kaskadiertes GroupingBy verwenden, da sie nur nach Feldern innerhalb desselben Objekts gruppiert.

Die Antwort besteht darin, Stream.flatMap zu verwenden, um einen Stream von Schlüssel-Wert-Paaren zu erstellen, wobei der Schlüssel Item.key1 und der ist Der Wert ist SubItem.key2. Dieser Stream wird dann mit Collectors.groupingBy gruppiert, um die gewünschte verschachtelte Gruppierung zu erreichen:

<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
    .flatMap(item -> item.getSubItems().stream()
        .map(sub -> new AbstractMap.SimpleImmutableEntry<>(item.getKey1(), sub)))
    .collect(Collectors.groupingBy(AbstractMap.SimpleImmutableEntry::getKey,
                Collectors.mapping(Map.Entry::getValue,
                    Collectors.groupingBy(SubItem::getKey2))));</code>
Nach dem Login kopieren

Alternativ vereinfacht sich die Lösung mit Collectors.flatMapping von Java 9 wie folgt:

<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
    .collect(Collectors.groupingBy(Item::getKey1,
                Collectors.flatMapping(item -> item.getSubItems().stream(),
                    Collectors.groupingBy(SubItem::getKey2))));</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie gruppiere ich verschachtelte Java 8-Objekte mithilfe von Collectors nach mehreren Schlüsseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!