複雑なオブジェクト構造に対する Java 8 のネストされたグループ化
Java 8 では、Collectors.groupingBy メソッドは、アイテムに基づいてグループ化する強力な方法を提供します。特定のプロパティについて。これにより、データを効率的に集約して要約することができます。ただし、複数レベルのグループ化を実行するシナリオはどうすればよいでしょうか?
次のクラス構造を考えてみましょう:
<code class="java">class Pojo { List<Item> items; } class Item { T key1; List<SubItem> subItems; } class SubItem { V key2; Object otherAttribute1; }</code>
目的は、key1 に基づいて項目をグループ化し、それぞれについて項目をグループ化することです。項目グループ、さらに key2 に基づいてサブ項目をグループ化します。必要な出力は、次の形式のマップです。
<code class="java">Map<T, Map<V, List<SubItem>>></code>
このシナリオでは、標準の Collectors.groupingBy を使用するだけでは十分ではありません。課題は、単一の項目を複数のキーでグループ化することにあります。
解決策: 構造を平坦化する
この問題を解決する鍵は、構造を一時的に平坦化することです。これにより、必要なグループ化を実行する前に、Item と SubItem の組み合わせのストリームを作成できます。
1 つの方法は、Stream. flatMap メソッドを使用して Map.Entry オブジェクトのストリームを作成することです。 Item と SubItem のペアを表します:
<code class="java">Map<T, Map<V, List<SubItem>>> result = pojo.getItems().stream() .flatMap(item -> item.subItems.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>
Collectors. flatMapping を使用した代替ソリューション (Java 9 )
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 以降の複雑なオブジェクト構造。
以上がJava 8 で複数のプロパティに基づいてネストされたグループ化を実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。