Java8 groupingBy 分组,真的很好用

平时开发中经常会对查询出来的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 分组操作,后续如有扩展,再进行补充。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 8的groupingBy是一个用于对集合进行分组的方法。它是Stream API中的一个终端操作,可以基于给定的分类函数将元素分组成一个Map。 下面是groupingBy方法的基本语法: ``` public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier) ``` 其中,T表示集合中的元素的类型,K表示分组的键的类型。classifier是一个函数,用于根据元素生成分组的键。 下面是一个示例,演示如何使用groupingBy对一个字符串集合进行分组,按照字符串的长度进行分组: ```java List<String> strings = Arrays.asList("apple", "banana", "cat", "dog", "elephant", "fish"); Map<Integer, List<String>> result = strings.stream() .collect(Collectors.groupingBy(String::length)); System.out.println(result); ``` 运行结果为: ``` {3=[cat, dog], 4=[fish], 5=[apple], 6=[banana], 8=[elephant]} ``` 在这个例子中,我们使用String::length作为分类函数,将字符串按照长度分组成一个Map,其中键是字符串的长度,值是具有相同长度的字符串列表。 除了上述示例,groupingBy还可以与其他收集器一起使用,实现更复杂的分组操作。例如,我们可以使用groupingBy结合counting收集器来统计每个分组中元素的数量: ```java Map<Integer, Long> result = strings.stream() .collect(Collectors.groupingBy(String::length, Collectors.counting())); System.out.println(result); ``` 运行结果为: ``` {3=2, 4=1, 5=1, 6=1, 8=1} ``` 这个例子中,我们使用groupingBy和counting收集器结合,统计每个分组中元素的数量。 总结:Java 8的groupingBy方法是一个强大的工具,可以帮助我们对集合进行灵活的分组操作。它通过分类函数将元素分组成一个Map,可以与其他收集器一起使用,实现更复杂的分组统计等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值