java8 : Collectors.groupingBy(分组)

Collectors.groupingBy配合Stream流使用,可以对集合中一个或多个属性进行分组,分组后还可以做聚合运算。

首先把数据放入集合:

	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"), "百威啤酒", "啤酒");Product prod6 = new Product(5L, 7, new BigDecimal("25"), "百威啤酒", "啤酒");List<Product> prodList = List.of(prod1, prod2, prod3, prod4, prod5, prod6);

按照类别分组

Map<String, List<Product>> map1 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
Set<Map.Entry<String, List<Product>>> entries1 = map1.entrySet();
for (Map.Entry<String, List<Product>> entry : entries1) {System.out.println(entry);
}

输出结果:

啤酒=[Product{id=4, num=3, price=10, name='青岛啤酒', category='啤酒'}, Product{id=5, num=10, price=15, name='百威啤酒', category='啤酒'}, Product{id=5, num=7, price=25, name='百威啤酒', category='啤酒'}]零食=[Product{id=1, num=1, price=15.5, name='面包', category='零食'}, Product{id=2, num=2, price=20, name='饼干', category='零食'}, Product{id=3, num=3, price=30, name='月饼', category='零食'}]

按照多个属性拼接分组

Map<String, List<Product>> map2 = prodList.stream().collect(Collectors.groupingBy(item -> item.getCategory() + "_" + item.getName()));
Set<Map.Entry<String, List<Product>>> entries2 = map2.entrySet();
for (Map.Entry<String, List<Product>> entry : entries2) {System.out.println(entry);
}

输出结果(可以看到百威啤酒那组有两个对象):

零食_月饼=[Product{id=3, num=3, price=30, name='月饼', category='零食'}]零食_面包=[Product{id=1, num=1, price=15.5, name='面包', category='零食'}]啤酒_百威啤酒=[Product{id=5, num=10, price=15, name='百威啤酒', category='啤酒'}, Product{id=5, num=7, price=25, name='百威啤酒', category='啤酒'}]啤酒_青岛啤酒=[Product{id=4, num=3, price=10, name='青岛啤酒', category='啤酒'}]零食_饼干=[Product{id=2, num=2, price=20, name='饼干', category='零食'}]

根据不同条件分组

这里按照num数值的大小来分

Map<String, List<Product>> map3 = prodList.stream().collect(Collectors.groupingBy(item -> {if (item.getNum() > 3) {return "num大于3";} else if (item.getNum() < 3) {return "num小于3";} else {return "num等于3";}
}));
Set<Map.Entry<String, List<Product>>> entries3 = map3.entrySet();
for (Map.Entry<String, List<Product>> entry : entries3) {System.out.println(entry);
}

输出结果:

num小于3=[Product{id=1, num=1, price=15.5, name='面包', category='零食'}, Product{id=2, num=2, price=20, name='饼干', category='零食'}]num等于3=[Product{id=3, num=3, price=30, name='月饼', category='零食'}, Product{id=4, num=3, price=10, name='青岛啤酒', category='啤酒'}]num大于3=[Product{id=5, num=10, price=15, name='百威啤酒', category='啤酒'}, Product{id=5, num=7, price=25, name='百威啤酒', category='啤酒'}]

多级分组

这里先按照类别分组,再按照num分组

Map<String, Map<String, List<Product>>> map4 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.groupingBy(item -> {if (item.getNum() >= 8) {return "num大于等于8";} else {return "num小于8";}})));
Set<Map.Entry<String, Map<String, List<Product>>>> entries4 = map4.entrySet();
for (Map.Entry<String, Map<String, List<Product>>> entry : entries4) {System.out.println(entry);
}

输出结果:

啤酒={num小于8=[Product{id=4, num=3, price=10, name='青岛啤酒', category='啤酒'}, Product{id=5, num=7, price=25, name='百威啤酒', category='啤酒'}], num大于等于8=[Product{id=5, num=10, price=15, name='百威啤酒', category='啤酒'}]}零食={num小于8=[Product{id=1, num=1, price=15.5, name='面包', category='零食'}, Product{id=2, num=2, price=20, name='饼干', category='零食'}, Product{id=3, num=3, price=30, name='月饼', category='零食'}]}

分组后再聚合求总数

这里先按照类别分组,再聚合求总数

Map<String, Long> map5 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.counting()));
Set<String> strings5 = map5.keySet();
for (String s : strings5) {System.out.println(s + "---" + "总数:" + map5.get(s));
}

输出结果:

啤酒---总数:3
零食---总数:3

分组后再做相加运算

这里先按照类别分组,再聚合运算(把num相加)

Map<String, Integer> map6 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory, Collectors.summingInt(Product::getNum)));
Set<String> strings6 = map6.keySet();
for (String s : strings6) {System.out.println(s + "---" + "num相加后:" + map6.get(s));
}

输出结果:

啤酒---num相加后:20
零食---num相加后:6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码与传统开发:综合比较

近年来&#xff0c;低代码开发作为软件开发的趋势获得了显着的发展势头。根据 MarketsandMarkets 的数据&#xff0c;低代码开发市场预计将实现 28.1% 的大幅增长率&#xff0c;到 2025 年价值将达到 455 亿美元。这一显着增长表明了各行业和企业对低代码平台的需求和采用不断增…

2023前端流行的新技术

作为2023年之前的技术水平有限&#xff0c;以下是一些目前为止较为热门的前端开发技术和趋势&#xff0c;这些技术可能在2023年之前进一步发展和普及。 前端程序员可以考虑学习和掌握以下技术&#xff1a; 1.Vue 3和React Hooks&#xff1a;Vue.js和React是目前最受欢迎的JavaS…

人工智能基础_机器学习027_L2正则化_岭回归_非稀疏性_原理解读_公式推导---人工智能工作笔记0067

然后我们再来看一下岭回归,也就是第二范数对吧, 他的公式,平方以后,加和然后开平方.L2的公式是 可以看到L2公式,也是有个阿尔法,惩罚项对吧. 可以看到因为L2带有平方,所以他的图形是个圆形 我们可以把L2范数,进行画出来看看 这里我们先看L2的公式,这里我们让 这个公式写成1 …

2023-11-14 mysql-主从复制-重置主从连接-记录

摘要: mysql的主从复制, 当从库执行binlog出错后, 会中止主从复制. 此时需要重置主从连接, 以重建主从关系. 主库操作: 一. 清理同步的数据库 drop database test;二. 重置主库状态 reset master;reset slave all;三. 检测主库状态 show master status;mysql> show master…

【已解决】vscode 配置C51和MDK环境配置

使用命令 gcc -v -E -x c - 看自己gcc 有没有安装好 也可以在自己的vscode中新建一个终端 gcc -v g -v 首先把自己的C51 和MDK 路径 设置好 vscode 中设置 C51 和 MDK 的路径 这是你keil 中写 51单片机和 STM32 的 如果你出现什么include 的什么波浪线&#xff0c;那估计…

2023亚太杯数学建模B题思路解析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

基于FPGA的图像RGB转HLS实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1计算最大值和最小值 4.2计算亮度L 4.3计算饱和度S 4.4计算色调H 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到MATLAB显示效果&#xff1a; 2.算法运行软件版本 Vivado…

react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索

InfiniteScroll 的组件见&#xff1a; https://blog.csdn.net/Zhooson/article/details/134396945 search.tsx 页面 import { FC, useEffect, useState } from react import InfiniteScroll from ../../components/InfiniteScrollconst tabs [{id: 1,title: tab-1,index: 1…

【python】选数

题目&#xff1a; """ 题目描述&#xff1a; 给定一个由 n 个整数组成的序列x_1, x_2,..., x_n)&#xff0c;以及一个整数 k ( k < n )。从这 n 个整数中选择 k 个整数相加&#xff0c;可以得到多种不同的和。例如&#xff0c;当 n 4&#xff0c;k 3&#…

国际阿里云:云服务器灾备方案!!!

保障企业业务稳定、IT系统功能正常、数据安全十分重要&#xff0c;可以同时保障数据备份与系统、应用容灾的灾备解决方案应势而生&#xff0c;且发展迅速。ECS可使用快照、镜像进行备份。 灾备设计 快照备份 阿里云ECS可使用快照进行系统盘、数据盘的备份。目前&#xff0c;阿…

快手自动引流软件的运行分享,以及涉及到技术与核心代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 引流是任何网络创业者或营销人员必备的技能之一。手动引流不仅耗时&#xff0c;而且效果难以保证。因此&#xff0c;自动引流软件应运而生&#xff0c;成为许多人的得力助…

Python中的filter函数用法详解

目录 引言 一、filter函数基本用法 二、filter函数应用场景 1、筛选符合条件的元素 2、数据清洗和预处理 3、复杂条件筛选 4、与其他函数结合使用 三、filter函数与lambda表达式 四、filter函数与列表推导式 五、总结 引言 Python中的filter函数是一种内置的高效过滤…

OpenGL学习之路-2

glut程序 8.多窗口且子窗口能够跟随reshape的变化而变化 /// #include <GL/glut.h> #include <iostream>/// int winWidth, winHeight; // <<NEW!!! int mainWinID; //…

15. 机器学习——聚类

机器学习面试题汇总与解析——聚类 本章讲解知识点 什么是聚类K-means 聚类算法均值偏移聚类算法DBSCAN 聚类算法高斯混合模型(GMM)的期望最大化(EM)聚类层次聚类算法本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像…

从道一云到畅捷通T+通过接口配置打通数据

从道一云到畅捷通T通过接口配置打通数据 接通系统&#xff1a;道一云 在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提供集智能门户解决网关流量问题、企业微信端的…

Linux上部署服务

这里以python脚本为例 创建服务&#xff1a; # 查看已有的服务有哪些 cd /etc/systemd/system ls# 创建新服务 sudo vim test.service#编辑service文件内容&#xff08;如果无法输入或修改&#xff0c;点击i代表insert&#xff09; [Unit] Description项目描述Wantsnetwork.t…

es 7.0常用的命令

es 7.0常用的命令 es 7.0中只有索引和文档(document)&#xff0c;没有类型(type)了。 es新建索引&#xff1a; 格式&#xff1a; PUT /索引名称 {"mappings":{"properties":{"字段名称":{"type":"字段类型"}}} }PUT 加索…

Spring Cache 入门教程

一&#xff1a;Spring缓存抽象 Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术&#xff1b;并支持使用JCache&#xff08;JSR-107&#xff09;注解简化我们开发&#xff1b; Cache接口为缓存的组件规…

提升效率!MuLogin指纹浏览器自动执行重复任务

在现代生活和工作中&#xff0c;我们经常需要处理各种繁琐的重复任务&#xff0c;这不仅浪费时间和精力&#xff0c;还可能导致效率低下。幸运的是&#xff0c;MuLogin指纹浏览器提供了强大的自动化功能&#xff0c;可以自动执行重复任务&#xff0c;并通过编写脚本和API接口的…

JAVA深化篇_40—— Lambda表达式介绍

Lambda表达式介绍 Lambda简介 Lambda 表达式是 JDK8 的一个新特性&#xff0c;可以取代大部分的匿名内部类&#xff0c;写出更优雅的 Java 代码&#xff0c;尤其在集合的遍历和其他集合操作中&#xff0c;可以极大地优化代码结构。 在Java语言中&#xff0c;可以为变量赋予一…