ホームページ  >  記事  >  Java  >  複雑なデータ集約のために Java 8 でネストされた GroupBy 操作を実行する方法

複雑なデータ集約のために Java 8 でネストされた GroupBy 操作を実行する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 08:50:02461ブラウズ

How to Perform Nested GroupBy Operations in Java 8 for Complex Data Aggregation?

Java 8 のネストされた (マルチレベル) GroupBy

Java 8 のマルチレベルのグループ化により、以下に基づいてデータ オブジェクトの複雑な集約が可能になります。複数のフィールド。あなたの場合、一連のクラス Pojo、Item、SubItem があり、key1 に基づいて項目をグループ化し、そのグループ内のサブ項目を key2 に基づいてグループ化したいと考えています。

これを実現するには、単純に行うことはできません。ネストされた Collectors.groupingBy 呼び出しを使用します。これにより、異なるオブジェクトからの複数のキーによるグループ化が許可されなくなります。代わりに、 flatMap とグループ化コレクターの組み合わせを使用します。

<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.groupingBy(Map.Entry::getValue, Collectors.toList())));</code>

このアプローチでは、最初に flatMap を使用して、各アイテムと対応するサブアイテムの key1 を含むペアのストリームを作成します。次に、Collectors.groupingBy を 2 回適用します。1 回目は key1 でペアをグループ化し、もう 1 回目は Key2 で SubItem をグループ化します。

別の解決策は、Java 9 のような flatMapping 操作を提供するカスタム コレクターを定義することです。 Collectors. flatMapping:

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

このカスタム コレクターを使用すると、グループ化操作を簡素化できます:

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

以上が複雑なデータ集約のために Java 8 でネストされた GroupBy 操作を実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。