java8用Stream一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计
- getAverage(): 它返回所有接受值的平均值。
- getCount(): 它计算所有元素的总数。
- getMax(): 它返回最大值。
- getMin(): 它返回最小值。
- getSum(): 它返回所有元素的总和。
示例:统计用户status的最大值,最小值,求和,平均值
@GetMapping("/list")
public void list(){
List<InputForm> inputForms = inputFormMapper.selectList();
Map<String, IntSummaryStatistics> collect = inputForms.stream()
.collect(Collectors.groupingBy(InputForm::getCreateUserName, Collectors.summarizingInt(InputForm::getStatus))); // 对名字去重
Set<String> 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<InputForm> inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms); Map<String, Long> collect = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateUserName,
Collectors.counting())); System.out.println("collect = " + collect);
}
其中Collectors.groupingBy(InputForm::getCreateUserName, Collectors.counting())返回的是一个Map集合,InputForm::getCreateUserName代表key,Collectors.counting()代表value,我是按照创建人的姓名进行统计
可以看到总共有九条数据,其中莫昀锦有两个,周亚丽有七个
如果想看某个部门下面有哪些数据,可以如下代码:
@GetMapping("/list")
public Map<String, List<InputForm>> list(){
List<InputForm> inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms); Map<String, List<InputForm>> collect = inputForms.stream()
.collect(Collectors.groupingBy(InputForm::getCreateCompanyName)); return collect;
}
求最大值,最小值
@GetMapping("/list")
public Map<String, List<InputForm>> list(){
List<InputForm> inputForms = inputFormMapper.selectList();
System.out.println("inputForms = " + inputForms); Optional<InputForm> min = inputForms.stream()
.min(Comparator.comparing(InputForm::getId)); System.out.println("min = " + min);
return null;
}
可以看到此id是最小的,最大值雷同
对某个字段求最大,最小,求和,统计,计数
@GetMapping("/list")
public void list(){
List<InputForm> 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<InputForm> max = inputForms.stream().max(Comparator.comparing(InputForm::getAgency));
if (max.isPresent()){
System.out.println("max = " + max);
} // 求最小值
Optional<InputForm> 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<String, Long> collect4 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.counting()));
System.out.println("collect4 = " + collect4);
根据部门和是否退休进行分组,并汇总人数
// 根据部门和是否退休进行分组,并汇总人数
Map<String, Map<Integer, Long>> collect5 = inputForms.stream().collect(Collectors.groupingBy(InputForm::getCreateDeptName, Collectors.groupingBy(InputForm::getIsDelete, Collectors.counting())));
System.out.println("collect5 = " + collect5);
根据部门和是否退休进行分组,并取得每组中年龄最大的人
// 根据部门和是否退休进行分组,并取得每组中年龄最大的人
Map<String, Map<Integer, InputForm>> 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);
文章主要内容转自:Java8 Stream 一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计
java8用Stream一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计的更多相关文章
- SqlServer中 Partition By 的使用( 对多行数据分组后排序取每个产品的第一行数据)
1:数据库表结构: (产品图片表) select * from product_imgs 2:应用场景: 可见表中每一个产品(pro_id)可能对应多个图片(img),我想要按照添加时间的先后顺序,获 ...
- 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- R语言︱数据分组统计函数族——apply族用法与心得
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...
- 数据分组统计函数族——apply族用法与心得
笔者寄语:apply族功能强大,实用,可以代替很多循环语句,R语言中不要轻易使用循环语句. 原文链接: https://blog.csdn.net/sinat_26917383/article/det ...
- SQL数据分组后取最大值或者取前几个值(依照某一列排序)
今日做项目的时候,项目中遇到须要将数据分组后,分组中的最大值,想了想,不知道怎么做.于是网上查了查,最终找到了思路,经过比較这个查询时眼下用时最快的,事实上还有别的方法,可是我认为我们仅仅掌握最快的方 ...
- mysql按天,小时,半小时,N分钟,分钟进行数据分组统计
转自:https://blog.csdn.net/u010946448/article/details/83752984#_75
- mysql group by 与order by的实例分析(mysql分组统计后最大值)
CREATE TABLE `test` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) CHARACTER SET latin1 DEFAULT NULL, `c ...
- java从键盘输入一组数据,输出其最大值,平均值,最小值没法输出
总结::需要耐心,加思考.做事不思考,那就是白做徒劳!!!!! package com.aini; import java.util.Scanner; //操...为什么数组的大小比较我硬是搞不懂,比 ...
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...
随机推荐
- list集合中的实现类LinkedList
LinkedList: 底层是一个双向链表,方便数据的频繁出入.便于快速插入,删除元素,不太方便进行查询 toArray(): 以正确的顺序(从第一个到最后一个素)返回一个包含此列表中所有元素的数组 ...
- #分治 or 线段树+单调栈#CF526F Pudding Monsters
题目 给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子. 求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子. 分析 先将 ...
- Socket.D v2.4.9 发布
Socket.D 是什么东东? 是基于"事件"和"语义消息""流"的网络应用协议.在微服务.移动应用.物联网等场景,可替代 http.web ...
- OpenHarmony社区运营报告(2023年9月)
●9月12日,由宁夏回族自治区教育厅.OpenAtom OpenHarmony(以下简称"OpenHarmony")项目群工作委员会指导,北京新大陆时代科技有限公司主办,宁夏职 ...
- SQL 通配符:用于模糊搜索和匹配的 SQL 关键技巧
SQL通配符字符 通配符字符用于替代字符串中的一个或多个字符.通配符字符与LIKE运算符一起使用.LIKE运算符用于在WHERE子句中搜索列中的指定模式. 示例 返回所有以字母 'a' 开头的客户: ...
- Java List集合去重、过滤、分组、获取数据、求最值、合并、排序、跳数据和遍历
前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 准备工作:现有一个User类.Student 类和Ticket类,加入相关依赖 @Data public class User { / ...
- 记录协助Javaer硬件快速开发过程之Web技术栈对接施耐德网络IO网关
前一段时间有个Java技术栈的朋友联系到我,需要快速对接现有的无人值守称重系统,这里的对接是指替代现有系统,而非软件层面的对接,也就是利用现有的硬件开发一套替代现有软件的自动化系统.主要设备包括地磅秤 ...
- 重新点亮linux 命令树————网络配置的查看[十一三]
前言 简单整理一下网络配置. 正文 通过ifconfig 查看. 这个就是ip地址. 网卡mac地址. 还有一块信息非常重要: 这个io开头的信息,这里面就是我们127.0.0.1的信息. 那么就来演 ...
- 【笔记】Oracle 窗口函数
Oracle 窗口函数 简单来说,窗口函数是分析函数的一种,通常可以理解成over()函数 构成:函数名①() over(partition by 分组的列名 order by 排序的列名 XXX) ...
- 力扣535(java)-TinyURL的加密与解密(中等)
题目: TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL ...