Heim > Java > javaLernprogramm > Hauptteil

Wie implementiert man eine mehrstufige Gruppierung mit verschachtelten Objekten in Java 8?

Patricia Arquette
Freigeben: 2024-10-24 08:47:30
Original
709 Leute haben es durchsucht

How to Implement Multi-Level Grouping with Nested Objects in Java 8?

Mehrstufige Gruppierung in Java 8 mit Nested GroupBy

In diesem Artikel wird erläutert, wie Sie eine mehrstufige Gruppierung beim Umgang mit verschachtelten Klassen in implementieren Java 8. Konkret besteht das Ziel darin, Elemente nach einem Feld „key1“ zu gruppieren und sie dann für jede Gruppe von Elementen weiter nach einem Feld „key2“ zu gruppieren. Letztendlich sollte die Ausgabe eine Zuordnung mit Schlüssel1 als äußerem Schlüssel und eine Zuordnung von Schlüssel2 zu einer Liste von Unterelementen sein.

Der erste Ansatz versucht, die Collectors.groupingBy-Methode zu verwenden, um dies zu erreichen, was jedoch der Fall ist Es ist nicht möglich, ein einzelnes Element direkt nach mehreren Schlüsseln zu gruppieren. Um dies zu überwinden, wird eine FlatMap-Operation verwendet.

Eine Methode besteht darin, mithilfe von Map.entrySet ein temporäres Paar zu erstellen, um Kombinationen von Elementen und Unterelementen vor dem Sammeln zu speichern. Der andere in Java 9 verfügbare Ansatz nutzt den FlatMapping-Kollektor, der die Ausführung des FlatMap-Vorgangs direkt im Kollektor ermöglicht.

Hier ist die FlatMap-Lösung:

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

Eine Alternative mit einem benutzerdefinierten Collector in Java 8:

<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

Dieser benutzerdefinierte Collector kann wie folgt verwendet 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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie implementiert man eine mehrstufige Gruppierung mit verschachtelten Objekten 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!