ホームページ  >  記事  >  Java  >  Java 8 で複数のプロパティに基づいてネストされたグループ化を実行する方法

Java 8 で複数のプロパティに基づいてネストされたグループ化を実行する方法

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

How to Perform Nested Grouping based on Multiple Properties in Java 8

複雑なオブジェクト構造に対する 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 サイトの他の関連記事を参照してください。

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