ネストされた GroupBy を使用した Java 8 でのマルチレベル グループ化
この記事では、Java 8 でネストされたクラスを処理するときにマルチレベル グループ化を実装する方法について説明します。 Java 8. 具体的には、項目を key1 フィールドでグループ化し、項目のグループごとに key2 フィールドでさらにグループ化することが目標です。最終的に、出力は外部キーとして key1 を持つマップと、サブアイテムのリストへの key2 のマップになるはずです。
最初のアプローチでは、これを達成するために Collectors.groupingBy メソッドを使用しようとしますが、単一の項目を複数のキーで直接グループ化することはできません。これを解決するには、 flatMap 操作を利用します。
1 つの方法では、Map.entrySet を使用して一時的なペアを作成し、収集する前に項目とサブ項目の組み合わせを保持します。 Java 9 で利用できるもう 1 つのアプローチは、 flatMapping コレクターを活用し、コレクター内で flatMap 操作を直接実行できるようにします。
flatMap ソリューションは次のとおりです:
Map>> 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))));
Java 8 のカスタム コレクターを使用する代替方法:
static Collector flatMapping(
Function super T,? extends Stream extends U>> mapper,
Collector super U,A,R> downstream) {
BiConsumer 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]));
}
このカスタム コレクターは次のように使用できます:
Map>> result = pojo.getItems().stream()
.collect(Collectors.groupingBy(Item::getKey1,
Collectors.flatMapping(item -> item.getSubItems().stream(),
Collectors.groupingBy(SubItem::getKey2))));
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3