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

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

DDD
DDDOriginal
2024-10-24 08:38:02228Durchsuche

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>

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>

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>

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!

Stellungnahme:
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