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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 08:47:30788Durchsuche

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>

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>

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>

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!

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