java8中的Collectors.groupingBy用法详解

 更新时间:2021年03月17日 11:39:08   作者:huayang183  
这篇文章主要介绍了java8中的Collectors.groupingBy用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组

数据准备:

public Product(Long id, Integer num, BigDecimal price, String name, String category) {
 this.id = id;
 this.num = num;
 this.price = price;
 this.name = name;
 this.category = category;
}
 
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(3L, 3, new BigDecimal("30"), "月饼", "零食");
Product prod4 = new Product(4L, 3, new BigDecimal("10"), "青岛啤酒", "啤酒");
Product prod5 = new Product(5L, 10, new BigDecimal("15"), "百威啤酒", "啤酒");
List<Product> prodList = Lists.newArrayList(prod1, prod2, prod3, prod4, prod5);

分组

按照类目分组:

Map<String, List<Product>> prodMap= prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
 
//{"啤酒":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"零食":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20},{"category":"零食","id":3,"name":"月饼","num":3,"price":30}]}

按照几个属性拼接分组:

Map<String, List<Product>> prodMap = prodList.stream().collect(Collectors.groupingBy(item -> item.getCategory() + "_" + item.getName()));
 
//{"零食_月饼":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30}],"零食_面包":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5}],"啤酒_百威啤酒":[{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"啤酒_青岛啤酒":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10}],"零食_饼干":[{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}

根据不同条件分组

Map<String, List<Product>> prodMap= prodList.stream().collect(Collectors.groupingBy(item -> {
 if(item.getNum() < 3) {
 return "3";
 }else {
 return "other";
 }
}));
 
//{"other":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30},{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}],"3":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}

多级分组

要实现多级分组,我们可以使用一个由双参数版本的Collectors.groupingBy工厂方法创 建的收集器,它除了普通的分类函数之外,还可以接受collector类型的第二个参数。那么要进 行二级分组的话,我们可以把一个内层groupingBy传递给外层groupingBy,并定义一个为流 中项目分类的二级标准。

Map<String, Map<String, List<Product>>> prodMap= prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {
 if(item.getNum() < 3) {
 return "3";
 }else {
 return "other";
 }
})));
 
//{"啤酒":{"other":[{"category":"啤酒","id":4,"name":"青岛啤酒","num":3,"price":10},{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15}]},"零食":{"other":[{"category":"零食","id":3,"name":"月饼","num":3,"price":30}],"3":[{"category":"零食","id":1,"name":"面包","num":1,"price":15.5},{"category":"零食","id":2,"name":"饼干","num":2,"price":20}]}}

按子组收集数据

求总数

Map<String, Long> prodMap = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.counting()));
 
//{"啤酒":2,"零食":3}

求和

Map<String, Integer> prodMap = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.summingInt(Product::getNum)));
 
//{"啤酒":13,"零食":6}

把收集器的结果转换为另一种类型

Map<String, Product> prodMap = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Product::getNum)), Optional::get)));
 
//{"啤酒":{"category":"啤酒","id":5,"name":"百威啤酒","num":10,"price":15},"零食":{"category":"零食","id":3,"name":"月饼","num":3,"price":30}}

联合其他收集器

Map<String, Set<String>> prodMap = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.mapping(Product::getName, Collectors.toSet())));
 
//{"啤酒":["青岛啤酒","百威啤酒"],"零食":["面包","饼干","月饼"]}

到此这篇关于java8中的Collectors.groupingBy用法详解的文章就介绍到这了,更多相关java8 Collectors.groupingBy 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java的泛型你真的了解吗

    java的泛型你真的了解吗

    这篇文章主要为大家详细介绍了java的泛型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • kafka与storm集群环境的安装步骤详解

    kafka与storm集群环境的安装步骤详解

    这篇文章主要给大家介绍了关于kafka与storm集群环境安装步骤的相关资料,两者并不是一定联系的,写在一起主要是因为两个都是有zookeeper管理的,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • java基础类型源码解析之多角度讲HashMap

    java基础类型源码解析之多角度讲HashMap

    这篇文章主要给大家介绍了关于java基础类型源码解析之HashMap的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java基具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Java去除字符串中空格的方法详解

    Java去除字符串中空格的方法详解

    这篇文章主要介绍了Java去除字符串中空格的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Ribbon负载均衡服务调用的示例详解

    Ribbon负载均衡服务调用的示例详解

    Rbbo其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,这篇文章主要介绍了Ribbon负载均衡服务调用案例代码,需要的朋友可以参考下
    2023-01-01
  • Springboot项目如何获取所有的接口

    Springboot项目如何获取所有的接口

    这篇文章主要介绍了Springboot项目如何获取所有的接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot集成JWT实现token验证的流程

    SpringBoot集成JWT实现token验证的流程

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).这篇文章主要介绍了SpringBoot集成JWT实现token验证,需要的朋友可以参考下
    2020-01-01
  • mybatis plus实现条件查询

    mybatis plus实现条件查询

    这篇文章主要为大家介绍了mybatis plus实现条件查询,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java中实现双数组Trie树实例

    Java中实现双数组Trie树实例

    这篇文章主要介绍了Java中实现双数组Trie树实例,双数组Trie就是一种优化了空间的Trie树,本文给出了实现代码、测试代码和测试结果,需要的朋友可以参考下
    2015-01-01
  • SpringBoot Actuator未授权访问漏洞修复详解

    SpringBoot Actuator未授权访问漏洞修复详解

    这篇文章主要介绍了SpringBoot Actuator未授权访问漏洞修复详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论