Heim  >  Artikel  >  Java  >  Wie implementiert man verschachtelte Gruppierungen in Java mithilfe von Collectors.groupingBy in Java 8?

Wie implementiert man verschachtelte Gruppierungen in Java mithilfe von Collectors.groupingBy in Java 8?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 08:54:30163Durchsuche

How to Implement Nested Grouping in Java Using Collectors.groupingBy in Java 8?

Verschachtelte (mehrstufige) Gruppierung nach in Java 8

Häufig besteht die Notwendigkeit, eine mehrstufige Gruppierung von Objekten basierend auf mehreren Schlüsseln durchzuführen . In diesem Fall haben wir eine Reihe von Klassen, die Daten darstellen, einschließlich einer Liste von Elementen mit einem Schlüssel und einer Liste von Unterelementen, ebenfalls mit einem Schlüssel. Das Ziel besteht darin, die Elemente nach ihrem Schlüssel zu gruppieren und für jede Aggregation die Unterelemente weiter nach ihrem Schlüssel zu gruppieren, was zu einer verschachtelten Karte führt.

Mit Collectors.groupingBy von Java 8 können wir dies durch den Einsatz einer Kombination erreichen von flatMap und einem benutzerdefinierten Flat-Mapping-Kollektor. Wir beginnen damit, mit Stream.flatMap ein temporäres Paar zu erstellen, um die Kombinationen von Elementen und Unterelementen zu speichern.

<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream()
        .flatMap(item -> item.subItems.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 können wir die Erstellung temporärer Objekte vermeiden, indem wir einen Flat-Mapping-Kollektor verwenden, was leider nicht der Fall ist verfügbar bis Java 9. Mit diesem Ansatz vereinfacht sich der Code 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>

Für Benutzer, die möglicherweise nicht auf Java 9 warten möchten, kann ein benutzerdefinierter Flat-Mapping-Kollektor implementiert werden:

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

Das obige ist der detaillierte Inhalt vonWie implementiert man verschachtelte Gruppierungen in Java mithilfe von Collectors.groupingBy in Java 8?. 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