ネストされたコレクタによる 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 サイトの他の関連記事を参照してください。