您不能通过多个键对单个项目进行分组,除非您接受该项目可能会出现在多个组中。在这种情况下,您想要执行一种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嵌套(多级)分组依据相关推荐

  1. java对list分组_Java List排序,分组等操作

    假定有一列实体类对像 List list = UserServer.getList(); 去重,去除重复对象(每个属性的值都一样的),需要注意的是要先重写对象User的equals和hashCode方 ...

  2. java 集合分组_java List 如何进行分组

    第四步:双字段分组. 1.此处依然使用了jdk1.8的新特性(转set时),也可以自己写两个for循环替代. 2.实体类使用的还是Student 3.设计思路就是先将要分组的两个字段分别转为set集合 ...

  3. 教你玩转CSS 分组选择器和嵌套选择器

    目录 分组选择器 嵌套选择器 分组选择器 在样式表中有很多具有相同样式的元素. h1 {color:green;}h2 {color:green;}p {color:green;} 为了尽量减少代码, ...

  4. 数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结...

    为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述. 1.在查询结果中显示列名: a.用as关键字:select name as '姓名' ...

  5. [冷枫推荐]:数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结。...

    为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述. 1.在查询结果中显示列名: a.用as关键字:select name as '姓名' ...

  6. java 下拉列表 可折叠 qq分组_Java在Excel中创建多级分组、折叠或展开分组的实现...

    本文介绍通过Java程序在Excel创建分组的方法,可对行或列分组进行分组并设置明细数据是否展开或折叠.设置数据分组并展开或折叠时,可通过以下方法: 方法一: 通过方法sheet.groupByRow ...

  7. java 下拉列表 可折叠 qq分组_Java 在Excel中创建多级分组、折叠或展开分组

    以下经验内容分享通过Java程序在Excel中创建多级分组.折叠或展开分组. 可对行或列分组进行分组并设置明细数据是否展开或折叠.设置数据分组并展开或折叠时,可通过以下方法: 方法一: 通过方法she ...

  8. java excel 展开折叠_Java在Excel中创建多级分组、折叠或展开分组的实现

    本文介绍通过java程序在excel创建分组的方法,可对行或列分组进行分组并设置明细数据是否展开或折叠.设置数据分组并展开或折叠时,可通过以下方法: 方法一: 通过方法sheet.groupbyrow ...

  9. 使用多级分组报表展现分类数据

    使用多级分组报表展现分类数据 当你走进便利店,你会发现所有的商品都是按类排放的,分类排放可以帮助您快速找到同类商品,也可以快速发现你想要的商品. 当去饭店吃饭的时候,菜单上的菜也是按类别排列的,比如凉 ...

最新文章

  1. Ubuntu 16.04 安装arm-linux-gcc交叉编译
  2. 从无到有算法养成篇-栈和队列·栈
  3. mysql补充(1)校对集utf8_unicode_ci与utf8_general_ci
  4. 2013\Province_C_C++_A\4.颠倒的价牌
  5. php监听网页日志,如何用php程序监听一个不断增长的日志文件
  6. cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念
  7. 神经网络激活函数=生物转换器?
  8. 招聘| 基因组所Yuwen Liu团队诚聘科研人员
  9. AndroidStudio_安卓原生开发_Android中使用HttpURLConnection发送同步Post请求_json数据到springBoot后台---Android原生开发工作笔记139
  10. php循环 跳转语句,golang循环跳转语句
  11. mvc5 源码解析2-2 mvchandler的执行
  12. 查看和修改mysql最大连接数
  13. ThinkBook 14P Win11网卡驱动掉了-解决方案
  14. 区块链开发(四)区块链技术详解PPT
  15. HTML,CSS中的复合写法总结
  16. 关于百分位数(percentile)
  17. 把汉字转换成拼音的util
  18. python mac可以运行win不能运行_Pymssql程序可以在mac上运行,但不能在windows上运行...
  19. 计算机语言 机器码,什么是机器码 机器码封了怎么解决-与非网
  20. 周志华机器学习笔记(一)

热门文章

  1. HDU 1033 水题
  2. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...
  3. 图像处理理论-颜色模式
  4. Java的加载与执行
  5. python调用c++的库传递二级指针
  6. linux语言 翻译工具,Linux文本转语音工具eSpeak介绍
  7. 4怎么修边_亦木良品阻燃板怎么样
  8. python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...
  9. vue function (i)第一次点击不执行_vue下$nextTick及原理浅析
  10. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 11丨产品销售分析 III【难度中等】