网易首页 > 网易号 > 正文 申请入驻

Java8 Stream 一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计

0
分享至

  • 示例:统计用户status的最大值,最小值,求和,平均值

  • 分组统计:

  • 如果我们想看某个部门下面有哪些数据,可以如下代码

  • 求最大值,最小值

  • 对某个字段求最大,最小,求和,统计,计数

  • 求最大值,最小值还可以这样做

  • 对某个字段求和并汇总

  • 求某个字段的平均值

  • 拼接某个字段的值,可以设置前缀,后缀或者分隔符

  • 根据部门进行分组,并获取汇总人数

  • 根据部门和是否退休进行分组,并汇总人数

  • 根据部门和是否退休进行分组,并取得每组中年龄最大的人

Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等

这些方法属于java 8的汇总统计类:

  • getAverage(): 它返回所有接受值的平均值。

  • getCount(): 它计算所有元素的总数。

  • getMax(): 它返回最大值。

  • getMin(): 它返回最小值。

  • getSum(): 它返回所有元素的总和。

示例:统计用户status的最大值,最小值,求和,平均值

看官可以根据自己的需求进行灵活变通

@GetMapping("/list")
public void list(){
List inputForms = inputFormMapper.selectList();
Map collect = inputForms.stream()
.collect(Collectors.groupingBy(InputForm::getCreateUserName, Collectors.summarizingInt(InputForm::getStatus)));

// 对名字去重
Set collect1 = inputForms.stream().distinct().map(InputForm::getCreateUserName).collect(Collectors.toSet());

// 遍历名字,从map中取出对应用户的status最大值,最小值,平均值。。。
for (String s1 : collect1) {
IntSummaryStatistics statistics1 = collect.get(s1);

System.out.println("第一个用户的名字为====" + s1);
System.out.println("**********************************************");
System.out.println("status的个数为===" + statistics1.getCount());
System.out.println("status的最小值为===" + statistics1.getMin());
System.out.println("status的求和为===" + statistics1.getSum());
System.out.println("status的平均值为===" + statistics1.getAverage());
System.out.println();
System.out.println();
}
}

结果如下:


图片分组统计:@GetMapping("/list")
public void list(){
List inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms);

Map collect = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateUserName,
Collectors.counting()));

System.out.println("collect = " + collect);
}

可以看到总共有九条数据,其中莫昀锦有两个,周亚丽有七个

推荐划水摸鱼神器: https://www.yoodb.com/slack-off/home.html
如果我们想看某个部门下面有哪些数据,可以如下代码@GetMapping("/list")
public Map> list(){
List inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms);

Map> collect = inputForms.stream()
.collect(Collectors.groupingBy(InputForm::getCreateCompanyName));

return collect;
}

图片求最大值,最小值@GetMapping("/list")
public Map> list(){
List inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms);

Optional min = inputForms.stream()
.min(Comparator.comparing(InputForm::getId));

System.out.println("min = " + min);
return null;
}

图片

可以看到此id是最小的,最大值雷同

对某个字段求最大,最小,求和,统计,计数@GetMapping("/list")
public void list(){
List inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms);

IntSummaryStatistics collect = inputForms.stream()
.collect(Collectors.summarizingInt(InputForm::getStatus));
double average = collect.getAverage();
int max = collect.getMax();
int min = collect.getMin();
long sum = collect.getSum();
long count = collect.getCount();

System.out.println("collect = " + collect);
}
求最大值,最小值还可以这样做// 求最大值
Optional max = inputForms.stream().max(Comparator.comparing(InputForm::getAgency));
if (max.isPresent()){
System.out.println("max = " + max);
}

// 求最小值
Optional min = inputForms.stream().min(Comparator.comparing(InputForm::getAgency));
if (min.isPresent()){
System.out.println("min = " + min);
}
对某个字段求和并汇总int sum = inputForms.stream().mapToInt(InputForm::getStatus).sum();
System.out.println("sum = " + sum);
求某个字段的平均值// 求某个字段的平均值
Double collect2 = inputForms.stream().collect(Collectors.averagingInt(InputForm::getStatus));
System.out.println("collect2 = " + collect2);

// 简化后
OptionalDouble average = inputForms.stream().mapToDouble(InputForm::getStatus).average();
if (average.isPresent()){
System.out.println("average = " + average);
}
拼接某个字段的值,可以设置前缀,后缀或者分隔符// 拼接某个字段的值,用逗号分隔,并设置前缀和后缀
String collect3 = inputForms.stream().map(InputForm::getCreateUserName).collect(Collectors.joining(",", "我是前缀", "我是后缀"));
System.out.println("collect3 = " + collect3);
根据部门进行分组,并获取汇总人数// 根据部门进行汇总,并获取汇总人数
Map collect4 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.counting()));
System.out.println("collect4 = " + collect4);
根据部门和是否退休进行分组,并汇总人数// 根据部门和是否退休进行分组,并汇总人数
Map> collect5 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.groupingBy(InputForm::getIsDelete, Collectors.counting())));
System.out.println("collect5 = " + collect5);
根据部门和是否退休进行分组,并取得每组中年龄最大的人// 根据部门和是否退休进行分组,并取得每组中年龄最大的人
Map> collect6 = inputForms.stream().collect(
Collectors.groupingBy(InputForm::getCreateDeptName,
Collectors.groupingBy(InputForm::getIsDelete,
Collectors.collectingAndThen(
Collectors.maxBy(
Comparator.comparing(InputForm::getAge)), Optional::get))));
System.out.println("collect6 = " + collect6);

版权声明:本文为CSDN博主「程序员小豪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 https://blog.csdn.net/A_D_H_E_R_E/article/details/132483843

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有技术或摸鱼交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!在线摸鱼:https://www.yoodb.com/

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
7-14美加墨世界杯半决赛分析:法国状态火热防守稳健,英格兰双核火力全开阿根廷连续苦战体能透支

7-14美加墨世界杯半决赛分析:法国状态火热防守稳健,英格兰双核火力全开阿根廷连续苦战体能透支

宏图体彩
2026-07-14 13:39:42
转告老人:以下4种病属于正常衰老,无需过度紧张,来看一下

转告老人:以下4种病属于正常衰老,无需过度紧张,来看一下

白宸侃片
2026-07-13 14:20:19
人口告别世界第一?催生“二孩”无效后,国家终于向住房出手了!

人口告别世界第一?催生“二孩”无效后,国家终于向住房出手了!

混沌录
2026-05-30 23:41:14
节省体能,本届世界杯仅梅西一名前锋单场走路距离5公里以上

节省体能,本届世界杯仅梅西一名前锋单场走路距离5公里以上

懂球帝
2026-07-14 00:22:33
父亲住我家20年,80大寿时宣布房子给弟弟,我给老公打电话

父亲住我家20年,80大寿时宣布房子给弟弟,我给老公打电话

兰姐说故事
2026-01-18 20:50:08
阿根廷到底为什么看起来很弱,却总是能逆转?

阿根廷到底为什么看起来很弱,却总是能逆转?

阿籫你好
2026-07-14 05:16:03
重大爆炸事故,15死16伤!从发现漏点到事故发生,23天未处置!

重大爆炸事故,15死16伤!从发现漏点到事故发生,23天未处置!

新浪财经
2026-07-14 03:46:26
比亚迪涉水行驶中脱落金属物,物件掉水中,线束还连着,被网友调侃唐雨生

比亚迪涉水行驶中脱落金属物,物件掉水中,线束还连着,被网友调侃唐雨生

大白聊IT
2026-07-14 02:16:48
杀青八年未能上映!周星驰《美人鱼 2》两主演塌房,成本飙升

杀青八年未能上映!周星驰《美人鱼 2》两主演塌房,成本飙升

繁华羽淡洛
2026-07-13 22:29:54
国际油价创6年内最大单日涨幅!

国际油价创6年内最大单日涨幅!

每日经济新闻
2026-07-14 13:47:03
赵本山妻子马丽娟直播吐露心声:家里开销全靠老赵,我从不会低人一等

赵本山妻子马丽娟直播吐露心声:家里开销全靠老赵,我从不会低人一等

观察鉴娱
2026-07-13 09:28:55
如果彭副处长她爸妈是下岗职工,那我就是眼神清澈的腹肌男大

如果彭副处长她爸妈是下岗职工,那我就是眼神清澈的腹肌男大

熊太行
2026-07-13 13:40:06
退路被堵死,柬埔寨国王妥协了,坐拥顶级皇宫,连拒绝签字都不敢

退路被堵死,柬埔寨国王妥协了,坐拥顶级皇宫,连拒绝签字都不敢

黑鹰观军事
2026-07-09 14:12:46
张灵甫战死后,蒋经国对他的老婆穷追不舍,做出一件不怀好意的事

张灵甫战死后,蒋经国对他的老婆穷追不舍,做出一件不怀好意的事

让生活充满温暖
2026-07-12 08:11:12
20死113伤!美指挥部遇袭,不到24小时,特朗普宣布:要拿下海峡

20死113伤!美指挥部遇袭,不到24小时,特朗普宣布:要拿下海峡

林子说事
2026-07-14 04:26:59
赶紧加油,3天后油价大涨!7月14日原油大涨近10%,新周期“低开高走”,今天92/95号汽油预涨超0.07元/升!

赶紧加油,3天后油价大涨!7月14日原油大涨近10%,新周期“低开高走”,今天92/95号汽油预涨超0.07元/升!

猪友巴巴
2026-07-14 12:40:03
他曾是国足带刀后卫,差点踢进世界杯,62岁已是广州足协副主席

他曾是国足带刀后卫,差点踢进世界杯,62岁已是广州足协副主席

乐趣纪史
2026-07-14 05:34:13
马斯克有句话点醒过我“如果今天我破产了,绝对不会去找工作,而是去做一件能快速产生现金流,并且可以复制放大的事。”

马斯克有句话点醒过我“如果今天我破产了,绝对不会去找工作,而是去做一件能快速产生现金流,并且可以复制放大的事。”

LULU生活家
2026-07-07 20:59:47
瑟洛特百科页面近日多次被网友篡改:他很自私;他不给哈兰德传球

瑟洛特百科页面近日多次被网友篡改:他很自私;他不给哈兰德传球

懂球帝
2026-07-14 14:09:18
1961年,贺龙视察南京军区,见到许世友大怒:你个“和尚”不老实

1961年,贺龙视察南京军区,见到许世友大怒:你个“和尚”不老实

浩渺青史
2026-07-13 18:55:20
2026-07-14 14:35:00
Java精选
Java精选
一场永远也演不完的戏
1796文章数 3859关注度
往期回顾 全部

科技要闻

Meta投1.7万亿元建一个AI园区,配10座电厂

头条要闻

男子得到"暗示"夜闯女邻居家想发生关系 被发现称抢劫

头条要闻

男子得到"暗示"夜闯女邻居家想发生关系 被发现称抢劫

体育要闻

33岁成为法国主力,他将在世界杯防守亚马尔

娱乐要闻

75岁施南生走完一生,撑起香港电影黄金时代

财经要闻

赛力斯的“代工厂”困境还能撑多久?

汽车要闻

小米澎程N90 Max工信部信息曝光 全尺寸旗舰 露营版首秀

态度原创

时尚
艺术
旅游
家居
军事航空

白Tee+阔腿裤、白Tee+彩色半裙,今年夏天最流行的搭配,谁穿谁时髦!

艺术要闻

看不起“馆阁体”的人,看过此帖后安静了

旅游要闻

暑期清凉游!来大理吹风,去安顺玩水

家居要闻

2026建博会(广州) 公装联探展交流活动

军事要闻

美军宣布将于14日恢复对伊朗的海上封锁

无障碍浏览 进入关怀版