Java List排序,分组等操作_java list 分组_好大一只鸡的博客-程序员宅基地

技术标签: JAVA  

假定有一列实体类对像

    List<User> list = UserServer.getList();

去重,去除重复对象(每个属性的值都一样的),需要注意的是要先重写对象User的equals和hashCode方法

    List<User> distinctList = list.stream().distinct().collect(Collectors.toList());

排序,按id升续排列,如果要降续则改成:(a, b) -> b.getId() - a.getId(); a和b都是变量名(可以按自己意愿取名字),都是list中的对象的实例

    List<User> sortList = list.stream().sorted((a, b) -> a.getId() - b.getId()).collect(Collectors.toList());

过滤,按照自己的需求来筛选list中的数据,比如我筛选出不及格的(小于60分)的人,t为实例

    List<User> filterList = list.stream().filter(t -> t.getScore() < 60).collect(Collectors.toList());

map, 提取对象中的某一元素,例子中我取的是每个人的name,注意list中类型对应,如果取的是id或者班级,就应该是integer类型

    List<String> mapList = list.stream().map(t -> t.getName()).collect(Collectors.toList());

统计,统计所有人分数的和, 主要我设置的分数属性是double类型的,所以用mapToDouble,如果是int类型的,则需要用mapToInt

    double sum = list.stream().mapToDouble(t -> t.getScore()).sum();
    int count = list.stream().mapToInt(t -> t.getId()).sum();

分组, 按照字段中某个属性将list分组

    Map<Integer, List<User>> map = list.stream().collect(Collectors.groupingBy(t -> t.getGrade()));
    System.out.println("按年级分组"+map);
    /*然后再对map处理,这样就方便取出自己要的数据*/
    for(Map.Entry<Integer, List<User>> entry : map.entrySet()){
        System.out.println("key:"+entry.getKey());
        System.out.println("value:"+entry.getValue());
    }

多重分组,先按年级分组,再按班级分组

    Map<Integer/*年级id*/, Map<Integer/*班级id*/, List<User>>> groupMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses())));
    
    System.out.println("按照年级再按班级分组:"+groupMap);
    System.out.println("取出一年级一班的list:"+groupMap.get(1).get(1));

多重分组,一般多重分组后都是为了统计,比如说统计每个年级,每个班的总分数

    Map<Integer/*年级id*/, Map<Integer/*班级id*/, Double>> sumMap = list.stream().collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.summingDouble(t -> t.getScore()))));
    System.out.println(sumMap);
    System.out.println("取出一年级一班的总分:"+sumMap.get(1).get(1));

stream是链式的,这些功能是可以一起使用的,例如:计算每个年级每个班的及格人数

    Map<Integer/*年级*/, Map<Integer/*班级*/, Long/*人数*/>> integerMap = list.stream().filter(t -> t.getScore() >= 60).collect(Collectors.groupingBy(t -> t.getGrade(), Collectors.groupingBy(t -> t.getClasses(), Collectors.counting())));
    System.out.println("取出一年级一班及格人数:"+integerMap.get(1).get(1));
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/stwuyiyu/article/details/96872341

智能推荐

吐槽下Arcgis的二次开发_gis二次开发_htsitr的博客-程序员宅基地

作为加入GIS这个行业有7,8年历史的我,非常害怕和Arcgis的底层API去接触,我宁可自己写算法,也不愿意碰它。当然在一般情况下,这对我来说,基本可以不用Arcgis就可以设计某些算法。我和我女朋友说过一段话,那个大体说Arcgis让人不去思考。那么今天就不扯那么远,先谈谈二次开发。我就不大而广的去说了。我觉得,之所以难用难记,是因为它强调接口编程,接口自然有接口的好处,但Arcgi..._gis二次开发

python 年月日,在Python中将年/月/日转换为年_Joy雒金凤的博客-程序员宅基地

I'm using the Python "datetime" module, i.e.:>>> import datetime>>> today = datetime.datetime.now()>>> print today2009-03-06 13:24:58.857946and I would like to compute the d..._python date 年月日转 day of the year

TML5期末大作业:影视网站设计——电影请以你的名字呼唤我(4页) 大学生简单个人静态HTML网页设计作品 DIY布局个人介绍网页模板代码 DY学生个人网站制作成品下载_web领域优质创作者-网页设计的博客-程序员宅基地

HTML5期末大作业:影视网站设计——电影请以你的名字呼唤我(4页) 大学生简单个人静态HTML网页设计作品 DIY布局个人介绍网页模板代码 DY学生个人网站制作成品下载常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业, 可满足大学生网页

SpringCloud学习笔记(一) 搭建一个SpringCloud_ncfl的博客-程序员宅基地

简介摘自百度百科: SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。SpringCloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring...

Java JDK中几个经典的版本_jdk常用版本_笑望灬星辰的博客-程序员宅基地

Java JDK中几个经典的版本1. 1995年05月23日 JDK 1.0 版发布,于1996年JDK正式提供下载,标志着Java的诞生。2. 1998年12月04日 JDK 1.2 版发布,而后Java正式更名为Java2 (只是一 个Java的升级版)3. 2005年05月23日 在Java十周年大会上推出了 JDK 1.5 版本, 带来了更多新特性。4. 2014年 Java 提供了JDK 1.8版本,并且支持Lambda表达式,可以使用函数式编程。(现在大多数项目是基于 JDK 1.8 版_jdk常用版本

Opencv学习----位图(bitmap)原理详解四---颜色深度转换_色彩位深转换-程序员宅基地

2.4 颜色深度转换通常,有必要将具有一种颜色深度的位图表示到具有不同颜色深度能力的设备上。当然,如果目标设备具有比位图更好的颜色,则没有问题,因为可以精确地表示位图。在目标具有不同和较低功能的相反情况下,必须将位图转换为能够提供最佳表示的内容。作为示例,考虑在单色(黑白)设备上表示灰度图像的问题。这是通过使用可变数量的黑色和白色像素来表示灰度级来实现的。幸运的是,黑白设备通常具有比位图高..._色彩位深转换

随便推点

Delphi中DBgridEH的基本用法_A 壹零贰肆的博客-程序员宅基地

1.复杂标题的制作标题行可设为2行以上高度,并可以为多列创建一个共同的父标题行。为实现这个效果,需在各个列标题属性中以“|”分隔父标题和子标题,如办公用品包括代码和名称两部分,具体属性设置如下:usemultititile := true;titlelines := 2;DBGridEh.Columns[0].Title.Caption := '办公用品|代码 ';DBGridEh..._dbgrideh

c++根据传入的字符串,动态调用对应的函数,目的是手工实现运行时函数的改变_c++ 通过字符串参数 调用成员函数_shijiu2012的博客-程序员宅基地

首先创建a.h,a.cpp,和b.cpp是三个文件。 1.a.h里面,包含三个函数,三个函数分别为,funca_wrapper, funca_impl1, funca_impl2,这三个 函数的函数签名(参数个数,类型和顺序)完全一样,提供一个辅助函数get_func_impl, 该函数根据传入的函数名字动态调用对应的函数(funca_impl1或funca_impl2), 2. a.cp..._c++ 通过字符串参数 调用成员函数

AttributeError: module ‘myutils‘ has no attribute ‘sort_contours‘,项目实战-信用卡数字识别--pychram如何配置相应的参数_module 'myutils' has no attribute 'semilogy_逗比小憨憨的博客-程序员宅基地

1,打开pycharm软件2,新建一个.py文件(注意:不要出现中文名)3,配置:(1)点击file(2)点击 settings…(3)点击4,配置参数右键点击自己新建的python文件点击: Edit project… 进入以下界面选中 Configuration这一栏,然后在参数这一栏输入参数输入参数格式如下:--image 自己存放图片的路径名\具体图片名 --template 自己存放图片的路径名\具体图片名 比如:我的设置如下:--image C_module 'myutils' has no attribute 'semilogy

在table表格中奇偶行数样式的改变_金含的博客-程序员宅基地

1.index9.css@CHARSET "UTF-8";.odd{ background: red;}.even{ background: green;}2.index9.jsp&lt;%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%&gt;&lt;%S..._html table 奇偶数列

Linux程序设计 makefile编译多文件时出现error: ld returned 1 exit status_errorldreturned1 linux make_DUT_WR的博客-程序员宅基地

之前百度这个错误都说是窗口开多了……但我是在make的时候出现的问题……链接时出现问题:检查好外部函数标志extern是否有遗漏和文件之间的依赖关系..._errorldreturned1 linux make

hadoop 安装glibc-2.14遇到的问题_大米粥哥哥的博客-程序员宅基地

安装glibc-2.14遇到的问题(CentOS 6.4 64位 标准版DVD):1.No rule to make target `/...libdl.so.2', needed by `/...elf/sprof'. Stop. 解决方法: 先make all 再make install 2.Can't open configuration file /opt/glibc-...