Verschachteltes (mehrstufiges) GroupBy in Java 8
Mehrstufige Gruppierung in Java 8 ermöglicht eine komplexe Aggregation von Datenobjekten basierend auf mehrere Felder. In Ihrem Fall haben Sie eine Reihe von Klassen Pojo, Item und SubItem und möchten Elemente basierend auf Schlüssel1 und dann Unterelemente innerhalb dieser Gruppe nach Schlüssel2 gruppieren.
Um dies zu erreichen, können wir nicht einfach Verwenden Sie verschachtelte Collectors.groupingBy-Aufrufe, da dies keine Gruppierung nach mehreren Schlüsseln aus verschiedenen Objekten ermöglichen würde. Stattdessen greifen wir auf eine Kombination aus flatMap und Gruppierungskollektoren zurück:
<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.groupingBy(Map.Entry::getValue, Collectors.toList())));</code>
Bei diesem Ansatz verwenden wir zunächst flatMap, um einen Stream von Paaren zu erstellen, der den Schlüssel1 von jedem Element und das entsprechende Unterelement enthält. Dann wenden wir Collectors.groupingBy zweimal an: einmal, um die Paare nach Schlüssel1 zu gruppieren, und noch einmal, um die Unterelemente nach Schlüssel2 zu gruppieren.
Eine alternative Lösung wäre, einen benutzerdefinierten Kollektor zu definieren, der eine FlatMapping-Operation ähnlich wie bei Java 9 bereitstellt Collectors.flatMapping:
<code class="java">static <T,U,A,R> Collector<T,?,R> flatMapping( Function<? super T,? extends Stream<? extends U>> mapper, Collector<? super U,A,R> downstream) { BiConsumer<A, ? super U> acc = downstream.accumulator(); return Collector.of(downstream.supplier(), (a, t) -> { try(Stream<? extends U> s=mapper.apply(t)) { if(s!=null) s.forEachOrdered(u -> acc.accept(a, u)); }}, downstream.combiner(), downstream.finisher(), downstream.characteristics().toArray(new Collector.Characteristics[0])); }</code>
Mit diesem benutzerdefinierten Collector kann der Gruppierungsvorgang vereinfacht werden:
<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 führt man verschachtelte GroupBy-Operationen in Java 8 für die komplexe Datenaggregation durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!