java8中的Collectors.groupingBy用法「建议收藏」

java8中的Collectors.groupingBy用法「建议收藏」Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组数据准备:publicProduct(Longid,Integernum,BigDecimalprice,Stringname,Stringcategory){ this.id=id; this.num=num; this.price=price; this.name=…

大家好,又见面了,我是你们的朋友全栈君。

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中map新增方法详解
java8中Stream的使用
java8中Collection新增方法详解
java8中Collectors的方法使用实例
java8中常用函数式接口
java8中的方法引用和构造函数引用
java8中的Collectors.groupingBy用法
java8中的Optional用法
java8中的日期和时间API

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125156.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月19日 下午12:00
下一篇 2022年4月19日 下午12:20


相关推荐

  • pytorch训练深度学习前期环境配置准备(包含安装Anaconda+在Anaconda下安装Pytorch+安装pycharm+pycharm中配置环境变量)

    pytorch训练深度学习前期环境配置准备(包含安装Anaconda+在Anaconda下安装Pytorch+安装pycharm+pycharm中配置环境变量)一 安装 Anaconda 下载地址 https www anaconda com distribution windows 前往官方下载页面下载 有两个版本可供选择 Python3 7 和 Python2 7 选择版之后根据自己操作系统的情况点击 64 BitGraphical 或 32 BitGraphical 进行下载 完成下载

    2026年3月27日
    3
  • PHP结合Ueditor并修改图片上传路径

    PHP结合Ueditor并修改图片上传路径

    2021年9月18日
    42
  • 直方图均衡化的数学原理

    直方图均衡化的数学原理直方图均衡化的数学原理直方图均衡化处理的 中心思想 是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布 直方图均衡化就是对图像进行非线性拉伸 重新分配图像像素值 使一定灰度范围内的像素数量大致相同 直方图均衡化就是把给定图像的直方图分布改变成 均匀 分布直方图分布 1 有关直方图均衡化的深入介绍 可以参考作者的另一篇博客直方图匹配的数学原理 下图为直方图均衡化的过程

    2026年3月26日
    3
  • RabbitMQ入门:Hello RabbitMQ 代码实例[通俗易懂]

    在之前的一篇博客RabbitMQ入门:认识并安装RabbitMQ(以Windows系统为例)中,我们安装了RabbitMQ并且对其也有的初步的认识,今天就来写个入门小例子来加深概念理解并了解代码怎么实

    2022年2月16日
    56
  • JavaSE:Java9 新特性

    JavaSE:Java9 新特性1.Java9概述Java发布于2017年9月发布,带来了很多新特性,其中最主要的变化是模块化系统模块就是代码和数据的封装体,模块的代码被组织成多个包,每个包中包含java类和接口,模块的数据则

    2022年7月4日
    29
  • maven坐标Dependencies和Exclusions详解

    maven坐标Dependencies和Exclusions详解1 概念介绍 Dependencies 是可选依赖 OptionalDepe Exclusions 是依赖排除 DependencyEx 2 Dependencies 1 当一个项目 A 依赖另一个项目 B 时 项目 A 可能很少一部分功能用到了项目 B 此时就可以在 A 中配置对 B 的可选依赖 举例来说 一个类似 hibernate 的项目 它支持对 mysql oracl

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号