• 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一行代码实现数据分组统计、排序、最大值、最小值、平均值、总数、合计的更多相关文章

  1. SqlServer中 Partition By 的使用( 对多行数据分组后排序取每个产品的第一行数据)

    1:数据库表结构: (产品图片表) select * from product_imgs 2:应用场景: 可见表中每一个产品(pro_id)可能对应多个图片(img),我想要按照添加时间的先后顺序,获 ...

  2. 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值

    不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...

  3. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  4. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

  5. 数据分组统计函数族——apply族用法与心得

    笔者寄语:apply族功能强大,实用,可以代替很多循环语句,R语言中不要轻易使用循环语句. 原文链接: https://blog.csdn.net/sinat_26917383/article/det ...

  6. SQL数据分组后取最大值或者取前几个值(依照某一列排序)

    今日做项目的时候,项目中遇到须要将数据分组后,分组中的最大值,想了想,不知道怎么做.于是网上查了查,最终找到了思路,经过比較这个查询时眼下用时最快的,事实上还有别的方法,可是我认为我们仅仅掌握最快的方 ...

  7. mysql按天,小时,半小时,N分钟,分钟进行数据分组统计

    转自:https://blog.csdn.net/u010946448/article/details/83752984#_75

  8. mysql group by 与order by的实例分析(mysql分组统计后最大值)

    CREATE TABLE `test` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) CHARACTER SET latin1 DEFAULT NULL, `c ...

  9. java从键盘输入一组数据,输出其最大值,平均值,最小值没法输出

    总结::需要耐心,加思考.做事不思考,那就是白做徒劳!!!!! package com.aini; import java.util.Scanner; //操...为什么数组的大小比较我硬是搞不懂,比 ...

  10. 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架

    问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...

随机推荐

  1. Scala 不可变Map

    1 package chapter07 2 3 object Test08_ImmutableMap { 4 def main(args: Array[String]): Unit = { 5 // ...

  2. #KD-Tree#洛谷 3710 方方方的数据结构

    题目 区间加,区间乘,单点查询,撤销修改 分析 由于可以离线,不妨把下标看成第一维,时间看成第二维,那么修改操作相当于在一个矩形上加或者乘, 不妨把查询的节点看作是二维平面上的点,这样实际上就可以用 ...

  3. #树形依赖背包,点分治#BZOJ 4182 Shopping

    题目 给定一棵大小为 \(n\) 的树,每个点代表一种物品,其具有体积.价值和数量的属性, 现在选择一个连通块,使得里面所有点都被选中且体积不超过 \(m\),问最大价值. \(n\leq 500,m ...

  4. 全平台GPU通用AI视频补帧超分教程

    全平台GPU通用AI视频补帧超分教程 本教程只发布于https://www.cnblogs.com/Icys 注意:本教程需要一定的命令行和视频编码知识,请谨慎食用. 软件准备 realcugan-n ...

  5. Python 简介和用途

    什么是Python? Python是一种流行的编程语言,由Guido van Rossum创建,并于1991年发布. 它用于以下领域: 网页开发(服务器端) 软件开发 数学 系统脚本编写 Python ...

  6. 使用labelimg标注数据集

    labelimg安装 在cmd命令行中运行如下命令: pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple 数据准备 新建一 ...

  7. Redis 17 穿透 击穿 雪崩

    使用缓存的问题 Redis 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面. 但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解. 如 ...

  8. 【FAQ】获取Push Token失败,如何进行排查?

    一. 获取Push Token的方式 获取Push Token有两种方式:一种是调用getToken方法向Push服务端请求Token,当getToken方法返回为空时,Token可通过onNewTo ...

  9. vue3探索——组件通信之v-model父子组件数据同步

    背景 再很多场景中,我们可能想在子组件中修改父组件的数据,但事实上,vue不推荐我们这么做,因为数据的修改不容易溯源. Vue2写法 在vue2中,我们使用.sync修饰符+自定义事件'update: ...

  10. HarmonyOS崩溃服务能力全新上线,帮你高效解决崩溃问题!

    原文:https://mp.weixin.qq.com/s/YmYzNXsvsqt8U8JX3vlmrg,点击链接查看更多技术内容. 一.为什么需要崩溃服务能力 用户在使用原子化服务时,出现卡顿.缓慢 ...