ホームページ >Java >&#&チュートリアル >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 サイトの他の関連記事を参照してください。