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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。