ホームページ  >  記事  >  Java  >  Java 8 でネストされたオブジェクトを使用してマルチレベルのグループ化を実装するにはどうすればよいですか?

Java 8 でネストされたオブジェクトを使用してマルチレベルのグループ化を実装するにはどうすればよいですか?

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

How to Implement Multi-Level Grouping with Nested Objects in Java 8?

入れ子になった GroupBy を使用した Java 8 でのマルチレベル グループ化

この記事では、Java 8 で入れ子になったクラスを扱うときにマルチレベル グループ化を実装する方法について説明します。 Java 8. 具体的には、項目を key1 フィールドでグループ化し、項目のグループごとに key2 フィールドでさらにグループ化することが目標です。最終的に、出力は key1 を外部キーとするマップ、および key2 のサブアイテムのリストへのマップになるはずです。

最初のアプローチでは、これを達成するために Collectors.groupingBy メソッドを使用しようとしますが、単一の項目を複数のキーで直接グループ化することはできません。これを克服するために、 flatMap 操作が利用されます。

1 つの方法では、Map.entrySet を使用して一時的なペアを作成し、収集する前に項目とサブ項目の組み合わせを保持します。 Java 9 で利用可能なもう 1 つのアプローチは、 flatMapping コレクターを活用し、コレクター内で flatMap 操作を直接実行できるようにします。

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

カスタム メソッドを使用する代替方法Java 8 のコレクター:

<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 でネストされたオブジェクトを使用してマルチレベルのグループ化を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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