Java8 stream流之分组 groupingBy 的使用

Java8 stream流之分组 groupingBy 的使用使用stream流可以让我们的代码看上去很简洁,本文举例了按照班级分组、分组再过滤、统计分组后人数、嵌套分组、分组排序…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

众所周知,使用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<Student> students = Stream.of(student1,student2,student3,student4,student5,student6).collect(Collectors.toList());

按照班级分组

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

统计每个班级人数

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

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

Map<String, Double> 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<String, Map<String, Integer>> 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<String, Map<Integer, List<Student>>> collect = students.stream().collect(Collectors.groupingBy(Student::getClassNumber, Collectors.groupingBy(Student::getAge)));

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

ConcurrentMap<String, List<Student>> collect = students.stream().collect(Collectors.groupingByConcurrent(Student::getClassNumber));

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

TreeMap<Integer, List<String>> 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<Integer, List<String>> collect = students.stream().collect(Collectors.groupingBy(Student::getAge, TreeMap::new, Collectors.mapping(Student::getName, Collectors.toList())));
Map<Integer, List<String>> collect2 = collect.descendingMap();
System.out.println(JSON.toJSONString(collect2));
//{18:["钱七"],17:["李四","老八"],16:["张三","王五","赵六"]}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql-mmm高可用架构

    mysql-mmm高可用架构

    2021年8月24日
    60
  • 20210225-1 Python错误与异常「建议收藏」

    20210225-1 Python错误与异常「建议收藏」一、什么是异常Python错误与异常什么是异常>异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生异常。异常是Pyth

    2022年7月5日
    24
  • console.writeline的功能(writeline用法)

    输入cw,然后按两次tab效果图

    2022年4月16日
    58
  • 台式计算机连不上网,台式机插上网线连不上网怎么办?[通俗易懂]

    台式计算机连不上网,台式机插上网线连不上网怎么办?[通俗易懂]由于你提供的问题描述不够详细具体,可能性太多了;这里为你分析下常见的一些情况以供参考!1.要确定是不是只有这一个台式机不能上网,同一个路由器下的其他终端是可以上网的。如果是这样,那基本和路由器设置无关(特殊情况例外)。2.台式机插上网线后,本地连接是否正常link起来?如果本地连接为一个“×”,那说明没有link成功,检查台式机的网卡驱动是否安装正常。由于此时台式机上不了网,建议你通过其他可以…

    2022年6月26日
    28
  • 2013-2019年百度搜索算法规则解读与应对

    2013-2019年百度搜索算法规则解读与应对2013-2019年百度搜索算法规则解读影响与建议百度冰桶算法百度冰桶算法1.0——》算法自2014年8月30日上线  主要打击移动端网站强行用户下载APP、用户登陆才能继续使用和大面积的广告覆盖行为,影响用户的浏览体验,尤其以必须下载app才能正常使用的站点。百度冰桶算法2.0——-》算法自2014年11月18日上线  主要打击移动端手机广告遮挡屏幕浏览,…

    2022年5月17日
    40
  • PC傻瓜式安装黑苹果并打造成全能逆向工作站–更新至2021.12.20

    PC傻瓜式安装黑苹果并打造成全能逆向工作站–更新至2021.12.20安装黑苹果有多简单原版Windows镜像安装大家都会,当然Ghost安装除外喔,太“乡村范儿”了。Windows操作系统的安装,无非下列四个步骤。准备镜像→写镜像到U盘→从U盘安装系统→系统自定义配置现在我们安装黑苹果也是同样的流程。先说一下本机的配置:2014年1999元买的宁美国度的组装台式机*CPU:i34160*GPU:HD4400CPU自带*RAM:4…

    2022年6月11日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号