collector list 多个分组_Java 8嵌套(多级)分组依据
您不能通過多個鍵對單個項目進行分組,除非您接受該項目可能會出現在多個組中。在這種情況下,您想要執行一種flatMap操作。
實現此目的的一種方法是Stream.flatMap與臨時對一起使用,以容納和的組合,Item然后SubItem再進行收集。由于不存在標準對類型,因此典型的解決方案是Map.Entry:
Map>> result = pojo.getItems().stream()
.flatMap(item -> item.subItems.stream()
.map(sub -> new AbstractMap.SimpleImmutableEntry<>(item, sub)))
.collect(Collectors.groupingBy(e -> e.getKey().getKey1(),
Collectors.mapping(Map.Entry::getValue,
Collectors.groupingBy(SubItem::getKey2))));
不需要這些臨時對象的替代方法是flatMap直接在收集器中執行操作,但是不幸的flatMapping是,直到Java 9才存在。
這樣,解決方案看起來像
Map>> result = pojo.getItems().stream()
.collect(Collectors.groupingBy(Item::getKey1,
Collectors.flatMapping(item -> item.getSubItems().stream(),
Collectors.groupingBy(SubItem::getKey2))));
如果我們不想等待Java 9,可以在代碼庫中添加一個類似的收集器,因為實現起來并不難:
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]));
}
總結
以上是生活随笔為你收集整理的collector list 多个分组_Java 8嵌套(多级)分组依据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度seo排名点击器app_百度SEO优
- 下一篇: java按时间范围过滤_在Java中,如