Heim > Java > javaLernprogramm > Hauptteil

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

Barbara Streisand
Freigeben: 2024-10-24 08:54:30
Original
179 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!