„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie implementiert man eine mehrstufige Gruppierung mit verschachtelten Objekten in Java 8?

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

Veröffentlicht am 07.11.2024
Durchsuche:440

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 anfängliche Ansatz versucht, die Collectors.groupingBy-Methode zu verwenden, um dies zu erreichen. Dies ist jedoch der Fall 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 der flatMap-Operation direkt im Kollektor ermöglicht.

Hier ist die flatMap-Lösung:

Map>> 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))));

Eine Alternative zur Verwendung eines benutzerdefinierten Collectors in Java 8:

static  Collector flatMapping(
    Function super T,? extends Stream extends U>> mapper,
    Collector super U,A,R> downstream) {

    BiConsumer 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]));
}

Dieser benutzerdefinierte Collector kann wie folgt verwendet werden:

Map>> result = pojo.getItems().stream()
    .collect(Collectors.groupingBy(Item::getKey1,
                Collectors.flatMapping(item -> item.getSubItems().stream(),
                    Collectors.groupingBy(SubItem::getKey2))));
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729730703 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3