Java8 groupingBy 分组,真的很好用
2023-12-13 12:01:55
平时开发中经常会对查询出来的list数据进行进行筛选,然后按照属性分组,根据属性进行业务逻辑处理。这样做的好处是避免for循环去遍历数据,以空间换时间,提升代码性能。
1. 根据属性进行分组(最常用)
// dao层操作拿到的list数据如下,具体逻辑不赘述
List<AccountDetail> accountDetailList = this.list(queryWrapper);
// 根据对象里面的某个属性分组,例如cmId
// 返回一个以属性cmId为key的Map,value是这个key的所有数据集合
Map<String, List<AccountDetail>> cmIdMap = accountDetailList .stream().collect(Collectors.groupingBy(AccountDetail::getCmId));
// 接下来可以根据自己的业务对这个map数据进行各种遍历,赋值等业务层面的处理
2. 根据多个属性进行分组(多个属性组成一个key)
这个和笔者在 java8 list转map 多属性拼接成一个 key 有异曲同工之妙
// 根据id 和 name 值进行分组
Map<String, List<AccountDetail>> detailMap = accountDetailList .stream().collect(Collectors.groupingBy(vo -> vo.getId() + vo.getCodeName()));
3. 对分组的key进行逻辑处理
// 例如对对象中的某些属性进行处理后再分组,类似过滤筛选
// 例如对用户开户行进行分组:招商银行用户为一组,其他银行用户为一组
Map<String, List<AccountDetail>> bankTypeMap = accountDetailList.stream().collect(Collectors.groupingBy(vo -> {
if ("0108".equals(vo.getBankCode())) {
return "1";
} else {
return "2";
}
}));
// 接下来就可以根据业务进行处理,例如只需要对招商银行的数据进行处理,如下
// 上面的map理论上只有两组,一组是招商银行,key为1,然后是它行,key为2
if (MapUtils.isNotEmpty(bankTypeMap)) {
// bankbankTypeMap.get("1") 获取分组数据处理即可
}
最后
上面是笔者经常使用的几种 stream 流的 groupingBy 分组操作,后续如有扩展,再进行补充。
文章来源:https://blog.csdn.net/weixin_49065828/article/details/134965470
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!