Ich habe wenige Klassen wie unten
%Vor% Ich möchte die Elemente basierend auf key1
aggregieren und für jede Aggregation sollten Unterelemente folgendermaßen nach key2
aggregiert werden:
Wie ist das mit Java 8 Collectors.groupingBy
nesting?
Ich habe etwas versucht und bin bei halbem Weg steckengeblieben
%Vor% Hinweis: Dies ist nicht dasselbe wie kaskadiertes groupingBy
, das eine mehrstufige Aggregation basierend auf Feldern im selben Objekt wie hier
Sie können ein einzelnes Element nicht mit mehreren Schlüsseln gruppieren, es sei denn, Sie akzeptieren, dass das Element möglicherweise in mehreren Gruppen angezeigt wird. In diesem Fall möchten Sie eine Art flatMap
-Operation ausführen.
Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Stream.flatMap
mit einem temporären Paar, das die Kombinationen von Item
und SubItem
vor dem Sammeln enthält. Aufgrund des Fehlens eines Standard-Paartyps ist es eine typische Lösung, Map.Entry
dafür zu verwenden:
Eine Alternative, die diese temporären Objekte nicht benötigt, wäre das Ausführen der Operation flatMap
im Kollektor, aber leider flatMapping
wird dort nicht bis Java 9 sein.
Damit würde die Lösung aussehen wie
%Vor%Wenn wir nicht auf Java 9 warten wollen, können wir unserer Codebasis einen ähnlichen Collector hinzufügen, da es nicht so schwer zu implementieren ist:
%Vor%Tags und Links java java-8 lambda collections java-stream