Heim >Java >javaLernprogramm >Wie gruppiere ich verschachtelte Java 8-Objekte mithilfe von Collectors nach mehreren Schlüsseln?
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!