Java8 | 如何使用Group By 聚合操作集合数据?


theme: scrolls-light

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

🤞 个人主页:@青Cheng序员石头
🤞 粉丝福利:加粉丝群 一对一问题解答,获取免费的丰富简历模板、提高学习资料等,做好新时代的卷卷王!

上文 《Java8 | 如何优雅地初始化Map & List2Map?》有讲到如何初始化Map以及List2Map的方式,有很多小伙伴提了不少优秀的建议,一鼓作气,继续写,坐等小伙伴围观。这篇文章就实际开发中很有可能用到的集合数据Group By处理,实践多种方法解决问题。

一、开发问题

集合数据分组很多在实际开发过程中是相当常见,比如传给前端的产品数据按照类型进行分组。最常见的方式是遍历整个集合,然后通过判断类型构造存储不同类型的集合。那么有没有更好的办法,Java8 groupingBy能帮到我们。

同样地, 假如我们有一个类Product,如下面的代码所示。 @Getter @Setter @ToString @Builder class Product{ private Long id; private String category; private String name; private int count; } 我们现在获取到了List<Product>格式的数据。 java static List<Product> getList(){ final List<Product> productList = new ArrayList<>(100); for(int i =1;i<=100;i++){ productList.add(Product.builder() .id((long) i) .name("name"+i) .category("category"+i%9) .count(i) .build()); } return productList; } 接下来我们对这个数据进行一些复杂的处理。

二、最简单的单列处理

按照category类型进行分组。 java final Map<String, List<Product>> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory)); 这里对于 Collectors.groupingBy的参数 Function<? super T, ? extends K> classifier的返回值作为Key 。

三、分组后统计指定列的总数

按照category类型进行分组,并且统计每个类型的count总数。 Map<String, Integer> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory, summingInt(Product::getCount))); 按照上面的代码就能得到从分组结果中得到总和。这上面是聚合操作,如果要做筛选操作,比如查看类型分组下数量最多的产品怎么做?
maxBy(comparingInt(*))即可。 Map<String, Optional<Product>> maps = productList.stream() .collect(Collectors.groupingBy(Product::getCategory, maxBy(comparingInt(Product::getCount)))); 用这些JDK现有的方法,在内存中转化数据的格式,能极大的提高开发效率。


少年,没看够?点击石头的详情介绍,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值