在开发过程中会经常遇到把一个List集合中的对象按照某个属性进行分组,然后把分组后的结果再另外处理的这种情况。分组的时候如果是比较简单的只需要分一次组,复杂情况时需要进行二次分组,甚至三次分组。我们可以使用Collectors.groupingBy 来提高工作效率。具体分组请看下面代码。

先创建一个Bean对象。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String name;
    private Integer age;
    private Date birthday;
    private Double ff;
}

普通的分组方式,可以通过Map的key是唯一的这种特性进行分组。

public static void main(String[] args) throws CloneNotSupportedException {
        // 需求根据name进行分组,key是name, value是List<Student>的集合
        // 数据初始化
        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Student student;
            if (i <2) {
                student = new Student("name", i, new Date(), 11.0);
            } else {
                student = new Student("name2", i, new Date(), 11.0);
            }

list.add(student);
        }
        // 分组方式1
        Map<String, List<Student>> map = new HashMap<>();
        for (Student student : list) {
            if (map.get(student.getName()) == null) {
                List<Student> studentList = new ArrayList<>();
                studentList.add(student);
                map.put(student.getName(), studentList);
            } else {
                map.get(student.getName()).add(student);
            }
        }
    }

使用collections.groupby来简化代码量

public static void main(String[] args) throws CloneNotSupportedException {
        // 需求根据name进行分组,key是name, value是List<Student>的集合
        // 数据初始化
        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Student student;
            if (i <2) {
                student = new Student("name", i, new Date(), 11.0);
            } else {
                student = new Student("name2", i, new Date(), 11.0);
            }

list.add(student);
        }
   
        // 这句分组与分组方式1的效果相同,但是代码量就少了很多,建议用下面的写法,需要java8以上。
        // 分组方式2
        Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getName));
        
        // 组内再分组,总共是2次分组,适用于先进行第一次分组,然后在第一次分组的基础上再进行一次分组的情况; key: name ,value: Map<ff, List<Student>
        // 先按name进行第一次分组,然后再按ff进行第二次分组;
        Map<String, Map<Double, List<Student>>> collect1 = list.stream().collect(Collectors.groupingBy(Student::getName, Collectors.groupingBy(Student::getFf)));
        System.out.println(collect1);
        Set<Map.Entry<String, Map<Double, List<Student>>>> entries = collect1.entrySet();
        for (Map.Entry<String, Map<Double, List<Student>>> entry : entries) {
            Map<Double, List<Student>> ffMap = entry.getValue();
            Set<Map.Entry<Double, List<Student>>> entries1 = ffMap.entrySet();
            for (Map.Entry<Double, List<Student>> doubleListEntry : entries1) {
                // 这时候的studentList 出来的 name和ff都是同一组的。
                List<Student> studentList = doubleListEntry.getValue();
            }
        }
    }

List集合进行分组相关推荐

  1. JDK8利用Stream为集合对象分组并编号

    package com.test;import com.xbz.common.utils.XDateUtil; import lombok.Data;import java.util.ArrayLis ...

  2. groupby java_Java8的groupBy实现集合的分组

    场景: Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 1.对集合按照单个属性分组 e.g. 按照skuId分组 Map> detai ...

  3. java groupbyu_Java8的groupBy实现集合的分组

    场景: Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 1.对集合按照单个属性分组 e.g. 按照skuId分组 Map> detai ...

  4. 在service层对集合进行分组处理

    问题是这样的:比方现在有一个集合List<User>,里面有N多条数据,User实体类如下: 我们有这样一个需求:要看看每个部门下面都有哪些员工? 可能有的小伙伴会觉得:这问题狗都知道怎么 ...

  5. Java List集合进行分组

    例: 先写一个类 public class Student {private Integer id;private String name;private String sex;private Int ...

  6. java8 使用拉姆达对基本数据类型集合进行分组

    List<String> strList = new ArrayList<String>(); Map<String, List<String>> gr ...

  7. stream流操作,对List集合进行分组、求和去重

    List<QueryPensionIncome> result = map.get(key).stream()// 表示id为key, 接着如果有重复的,那么从BillsNums对象o1与 ...

  8. lamda list 分组_java8lambda表达式对集合分组并且排序(记一次性能优化案例)

    最近遇到个需求是这样的: 写一个类似于通讯录的简单功能,要求是首先按照部门显示列表,然后点击部门下拉显示部门里面的人员信息,且人员信息按照职位排序. 先分析数据结构: 最外层是部门,部门里面是员工,且 ...

  9. java 实现集合分组功能

    1.代码 package com.xtm.java.test;import java.util.ArrayList; import java.util.Collection; import java. ...

最新文章

  1. 【学习笔记】超简单的多项式牛顿迭代(含泰勒展开式、牛顿迭代全套证明)
  2. 禅道开源项目管理软件正式发布2.3版本
  3. 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究
  4. 阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题
  5. 服务器集成显卡性能,Win8.1与Ubuntu 14.10:集成显卡性能PK
  6. 服务器响应401,如果服务器返回401响应,则重定向到登录页面(Redirect to login page if server returns 401 response)...
  7. SQL将本地图片文件插入到数据库
  8. 二分算法和冒泡排序时间复杂度分析
  9. Fiddler证书过期解决
  10. 零数科技获评《互联网周刊》2021元宇宙潜力企业TOP50
  11. Webpack的使用——进阶篇
  12. 2022考研资料每日更新(2021.07.28)
  13. 骑士CMSgetshell复现
  14. 注意:这些跳槽理由会被HR调查!
  15. 山东理工ACM【2761】编码
  16. Rdd,DataFrame和DataSet的区别
  17. Linux man指令查询文档设定成中文
  18. 深入Java集合ArrayList的源码解析
  19. 量子计算机怎么控制量子状态,量子计算机是什么 它为何如此强大
  20. 运行shell脚本时报错“[[ : not found“解决方法

热门文章

  1. 应用程序图标变成白色
  2. HP打印机 定时打印激活打印机(针对某些打印机需要激活才能打印的情况)
  3. 安装ubuntu 创建分区_安装Ubuntu后如何创建单独的主分区
  4. IPv6篇之即插即用
  5. 在Js中使程序睡眠的sleep方法
  6. 棋盘格自动生成器——四种格式(格雷码棋盘格、圆点、二维码棋盘格)
  7. SOP SO SOIC TSSOP SSOP 封装直观比较图 [转载]
  8. speedoffice文档中如何快速撤回到上一步操作
  9. Windows下用命令行注销用户(包括注销其他用户)
  10. Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)