ホームページ  >  記事  >  Java  >  コレクターを使用して Java 8 のネストされたオブジェクトを複数のキーでグループ化する方法

コレクターを使用して Java 8 のネストされたオブジェクトを複数のキーでグループ化する方法

DDD
DDDオリジナル
2024-10-24 08:38:02228ブラウズ

How to Group Java 8 Nested Objects by Multiple Keys Using Collectors?

ネストされたコレクタによる Java 8 マルチレベル グループ化

ネストされたグループ化とも呼ばれるマルチレベル グループ化には、複数のキーによるデータの集約が含まれます。ネストされたオブジェクト階層のさまざまなレベルにわたって。 Java 8 では、ネストされたコレクタを使用してこれを実現できます。

Pojo、Item、SubItem などのクラスがあり、各 Pojo に項目のリストがあり、各項目にサブアイテムのリスト。目標は、key1 フィールドで項目をグループ化し、グループごとに key2 フィールドで SubItem をさらに集計することです。

このネストされたグループ化を実行するには、ネストされた構造で Collectors.groupingBy を使用できます。

<code class="java">pojo.getItems()
    .stream()
    .collect(
        Collectors.groupingBy(Item::getKey1, **// How to group by SubItem::getKey2 here**));</code>

問題は、Collectors.groupingBy の 2 番目のパラメーター、つまり各 key1 グループ内の key2 によって SubItem をグループ化する方法にあります。このソリューションでは、同じオブジェクト内のフィールドごとにグループ化するだけであるため、カスケードされた groupingBy を利用できません。

その解決策には、Stream. flatMap を使用してキーと値のペアのストリームを作成することが含まれます。ここで、キーは Items.key1 であり、値はSubItem.key2です。次に、このストリームは、Collectors.groupingBy を使用してグループ化され、目的のネストされたグループ化を実現します。

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

または、Java 9 の Collectors. flatMapping を使用すると、ソリューションは次のように簡素化されます。

<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 のネストされたオブジェクトを複数のキーでグループ化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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