博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8 stream流之分组 groupingBy 的使用
阅读量:4147 次
发布时间:2019-05-25

本文共 3642 字,大约阅读时间需要 12 分钟。

众所周知,使用stream流可以让我们的代码看上去很简洁,现在我们实战使用一下stream的分组与分区。

准备用到的数据类public class Student{
//年级 private String grade; //班级 private String classNumber; //姓名 private String name; //年龄 private int age; //地址 private String address; //数学成绩 private int mathScores; //语文成绩 private int chainessScores; }添加数据 Student student1 = new Student("701","张三",16,"北京",78,90); Student student2 = new Student("700","李四",17,"北京",78,90); Student student3 = new Student("703","王五",16,"上海",78,90); Student student4 = new Student("701","赵六",16,"上海",78,90); Student student5 = new Student("700","钱七",18,"",78,90); Student student6 = new Student("701","老八",17,"",78,90);//这是一个高二年级的成绩单 List
students = Stream.of(student1,student2,student3,student4,student5,student6).collect(Collectors.toList());

按照班级分组

Map
> collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber));System.out.println(JSON.toJSONString(collect));//{"700":[{"age":17,"chainessScores":90,"classNumber":"700","mathScores":78,"name":"李四"},{"age":18,"chainessScores":90,"classNumber":"700","mathScores":78,"name":"钱七"}],//"701":[{"age":16,"chainessScores":90,"classNumber":"701","mathScores":78,"name":"张三"},{"age":16,"chainessScores":90,"classNumber":"701","mathScores":78,"name":"赵六"},{"age":17,"chainessScores":90,"classNumber":"701","mathScores":78,"name":"老八"}],//"703":[{"age":16,"chainessScores":90,"classNumber":"703","mathScores":78,"name":"王五"}]}

按照班级分组得到每个班级的同学姓名

Map
> collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.mapping(Student::getName, Collectors.toList())));System.out.println(JSON.toJSONString(collect));//{"700":["李四","钱七"],"701":["张三","赵六","老八"],"703":["王五"]}

统计每个班级人数

Map
collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.counting()));System.out.println(JSON.toJSONString(collect));//{"700":2,"701":3,"703":1}

求每个班级的数学平均成绩

Map
collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.averagingDouble(Student::getMathScores)));System.out.println(JSON.toJSONString(collect));//{"700":65.0,"701":61.0,"703":82.0}

按班级分组求每个同学的总成绩

Map
> collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.toMap(Student::getName, student -> student.getMathScores() + student.getChainessScores())));System.out.println(JSON.toJSONString(collect));//{"700":{"钱七":150,"李四":160},"701":{"张三":168,"老八":148,"赵六":137},"703":{"王五":172}}

嵌套分组,先按班级分组,再按年龄分组

Map
>> collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.groupingBy(Student::getAge)));

分组后得到一个线程安全的ConcurrentMap

ConcurrentMap
> collect = students.stream().collect(Collectors.groupingByConcurrent(Student::getClassNumber));

加上排序来一波

根据年龄分组并小到大排序,TreeMap默认为按照key升序

TreeMap
> collect = students.stream().collect(Collectors.groupingBy(Student::getAge, TreeMap::new, Collectors.mapping(Student::getName, Collectors.toList())));System.out.println(JSON.toJSONString(collect)); //{16:["张三","王五","赵六"],17:["李四","老八"],18:["钱七"]}

根据年龄分组并大到小排序,因为TreeMap默认为按照key升序,所以排完顺序再反转一下就OK了

TreeMap
> collect = students.stream().collect(Collectors.groupingBy(Student::getAge, TreeMap::new, Collectors.mapping(Student::getName, Collectors.toList())));Map
> collect2 = collect.descendingMap();System.out.println(JSON.toJSONString(collect2));//{18:["钱七"],17:["李四","老八"],16:["张三","王五","赵六"]}

转载地址:http://sviti.baihongyu.com/

你可能感兴趣的文章
软件(项目)的分层
查看>>
菜单树
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
Jackson Tree Model Example
查看>>
常用js收集
查看>>
如何防止sql注入
查看>>
springmvc传值
查看>>
在Eclipse中查看Android源码
查看>>
Android使用webservice客户端实例
查看>>
[转]C语言printf
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>