List集合进行分组
在开发过程中会经常遇到把一个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集合进行分组相关推荐
- JDK8利用Stream为集合对象分组并编号
package com.test;import com.xbz.common.utils.XDateUtil; import lombok.Data;import java.util.ArrayLis ...
- groupby java_Java8的groupBy实现集合的分组
场景: Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 1.对集合按照单个属性分组 e.g. 按照skuId分组 Map> detai ...
- java groupbyu_Java8的groupBy实现集合的分组
场景: Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 1.对集合按照单个属性分组 e.g. 按照skuId分组 Map> detai ...
- 在service层对集合进行分组处理
问题是这样的:比方现在有一个集合List<User>,里面有N多条数据,User实体类如下: 我们有这样一个需求:要看看每个部门下面都有哪些员工? 可能有的小伙伴会觉得:这问题狗都知道怎么 ...
- Java List集合进行分组
例: 先写一个类 public class Student {private Integer id;private String name;private String sex;private Int ...
- java8 使用拉姆达对基本数据类型集合进行分组
List<String> strList = new ArrayList<String>(); Map<String, List<String>> gr ...
- stream流操作,对List集合进行分组、求和去重
List<QueryPensionIncome> result = map.get(key).stream()// 表示id为key, 接着如果有重复的,那么从BillsNums对象o1与 ...
- lamda list 分组_java8lambda表达式对集合分组并且排序(记一次性能优化案例)
最近遇到个需求是这样的: 写一个类似于通讯录的简单功能,要求是首先按照部门显示列表,然后点击部门下拉显示部门里面的人员信息,且人员信息按照职位排序. 先分析数据结构: 最外层是部门,部门里面是员工,且 ...
- java 实现集合分组功能
1.代码 package com.xtm.java.test;import java.util.ArrayList; import java.util.Collection; import java. ...
最新文章
- 【学习笔记】超简单的多项式牛顿迭代(含泰勒展开式、牛顿迭代全套证明)
- 禅道开源项目管理软件正式发布2.3版本
- 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究
- 阿里巴巴Java开发手册-使用JDK8的Opional类来防止出现NPE问题
- 服务器集成显卡性能,Win8.1与Ubuntu 14.10:集成显卡性能PK
- 服务器响应401,如果服务器返回401响应,则重定向到登录页面(Redirect to login page if server returns 401 response)...
- SQL将本地图片文件插入到数据库
- 二分算法和冒泡排序时间复杂度分析
- Fiddler证书过期解决
- 零数科技获评《互联网周刊》2021元宇宙潜力企业TOP50
- Webpack的使用——进阶篇
- 2022考研资料每日更新(2021.07.28)
- 骑士CMSgetshell复现
- 注意:这些跳槽理由会被HR调查!
- 山东理工ACM【2761】编码
- Rdd,DataFrame和DataSet的区别
- Linux man指令查询文档设定成中文
- 深入Java集合ArrayList的源码解析
- 量子计算机怎么控制量子状态,量子计算机是什么 它为何如此强大
- 运行shell脚本时报错“[[ : not found“解决方法
热门文章
- 应用程序图标变成白色
- HP打印机 定时打印激活打印机(针对某些打印机需要激活才能打印的情况)
- 安装ubuntu 创建分区_安装Ubuntu后如何创建单独的主分区
- IPv6篇之即插即用
- 在Js中使程序睡眠的sleep方法
- 棋盘格自动生成器——四种格式(格雷码棋盘格、圆点、二维码棋盘格)
- SOP SO SOIC TSSOP SSOP 封装直观比较图 [转载]
- speedoffice文档中如何快速撤回到上一步操作
- Windows下用命令行注销用户(包括注销其他用户)
- Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)