Java8 Stream(11)List转Map

article/2025/8/26 11:24:06

在这里插入图片描述

一、前言

对于聚合统计可以参考下面博客。
Java8 Stream(12)Collectors 分组统计 详解
开发中,List转Map是非常常见的操作,例如:

  • List<T> 转 Map<String, T>
  • List<T> 转 Map<String, List<T>>
  • List<T> 转 Map<String, Count>
  • List<Map<String, Object>> 转 Map<String, List<Map<String, Object>>>

先造点数据:

pigs.add(new Pig(1, "猪爸爸", 31, "M", false));
pigs.add(new Pig(2, "猪妈妈", 28, "F", true));
pigs.add(new Pig(3, "乔治", 2, "M", false));
pigs.add(new Pig(4, "佩奇", 5, "F", false));

二、List转Map

1. List<T> 转 Map<String, List<T>>

使用groupingBy根据gender属性分组

Map<String, List<Pig>> groupByGender = pigs.stream().collect(Collectors.groupingBy(Pig::getGender));groupByGender.forEach((k, v) -> {System.out.println(k + " -> " + v);
});

结果如下:

F -> [Pig(id=2, name=猪妈妈, age=28, gender=F, valid=true), Pig(id=4, name=佩奇, age=5, gender=F, valid=false)]
M -> [Pig(id=1, name=猪爸爸, age=31, gender=M, valid=false), Pig(id=3, name=乔治, age=2, gender=M, valid=false)]

2. List<T> 转 Map<ID, T>

使用Collectors.toMap转换,如果id相同,取第1个

Map<Integer, Pig> mapById = pigs.stream().collect(Collectors.toMap(Pig::getId,a -> a,(k1, k2) -> k1)//如果id相同,取第1个);
mapById.forEach((k, v) -> {System.out.println(k + " -> " + v.toString());
});

结果如下:

1 -> Pig(id=1, name=猪爸爸, age=31, gender=M, valid=false)
2 -> Pig(id=2, name=猪妈妈, age=28, gender=F, valid=true)
3 -> Pig(id=3, name=乔治, age=2, gender=M, valid=false)
4 -> Pig(id=4, name=佩奇, age=5, gender=F, valid=false)

3. List<T> 转 Map<String, Count>

Map<String, Long> groupByGenderThenCount = pigs.stream().collect(Collectors.groupingBy(Pig::getGender,Collectors.counting()));groupByGenderThenCount.forEach((k, v) -> {System.out.println(k + " -> " + v);
});

结果如下:

F -> 2
M -> 2

4. List<T> 转 Map<ID, String>

Map<Integer, String> genderNameMap = pigs.stream().collect(Collectors.toMap(Pig::getId,pig -> pig.getName() == null ? "" : pig.getName(),(oldValue, newValue) -> newValue));genderNameMap.forEach((k, v) -> {System.out.println(k + " -> " + v.toString());
});

结果如下:

1 -> 猪爸爸
2 -> 猪妈妈
3 -> 乔治
4 -> 佩奇

5. 使用partitioningBy分区

Map<Boolean, List<Pig>> partitioningByValid =pigs.stream().collect(partitioningBy(Pig::isValid));partitioningByValid.forEach((k, v) -> {System.out.println(k + " -> " + v.toString());
});

结果如下:

false -> [Pig(id=1, name=猪爸爸, age=31, gender=M, valid=false), Pig(id=3, name=乔治, age=2, gender=M, valid=false), Pig(id=4, name=佩奇, age=5, gender=F, valid=false)]
true -> [Pig(id=2, name=猪妈妈, age=28, gender=F, valid=true)]

6. List<Map>排序

System.out.println("List<Map> 根据age降序, 再根据sex降序,sex默认M");
List<Map> sorted = userMaps.stream().sorted((map1, map2) -> {int age1 = (int) map1.getOrDefault("age", 0);int age2 = (int) map2.getOrDefault("age", 0);if (age1 == age2) {String sex1 = (String) map1.getOrDefault("sex", "M");String sex2 = (String) map2.getOrDefault("sex", "M");return sex2.compareTo(sex1);} else {return age2 - age1;}
}).collect(Collectors.toList());//记住一定要加上这句sorted.forEach(System.out::println);System.out.println("直接在List上排序");
userMaps.sort((map1, map2) -> {int age1 = (int) map1.getOrDefault("age", 0);int age2 = (int) map2.getOrDefault("age", 0);if (age1 == age2) {String sex1 = (String) map1.getOrDefault("sex", "M");String sex2 = (String) map2.getOrDefault("sex", "M");return sex2.compareTo(sex1);} else {return age2 - age1;}
});

7. List多字段排序,NULL值排序

System.out.println("按照ID升序");
users.sort(comparing(User::getId, Comparator.nullsFirst(String::compareTo)));
users.forEach(System.out::println);System.out.println("按照ID降序");
users.sort(comparing(User::getId, Comparator.nullsFirst(String::compareTo)).reversed());
users.forEach(System.out::println);System.out.println("按照age升序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsFirst(Integer::compareTo)));
users.forEach(System.out::println);System.out.println("按照age升序,NULL在后面");
users.sort(comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)));
users.forEach(System.out::println);System.out.println("按照age降序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)).reversed());
users.forEach(System.out::println);System.out.println("按照age降序,NULL在后面");
users.sort(comparing(User::getAge, Comparator.nullsFirst(Integer::compareTo)).reversed());
users.forEach(System.out::println);System.out.println("按照age升序,再按照sex升序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsFirst(Integer::compareTo)).thenComparing(User::getSex, Comparator.nullsFirst(String::compareTo)));
users.forEach(System.out::println);System.out.println("按照age升序,再按照sex降序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsFirst(Integer::compareTo)).thenComparing(comparing(User::getSex, Comparator.nullsLast(String::compareTo)).reversed() ));
users.forEach(System.out::println);System.out.println("按照age降序,再按照sex升序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)).reversed().thenComparing(User::getSex, Comparator.nullsFirst(String::compareTo)));
users.forEach(System.out::println);System.out.println("按照age降序,再按照sex降序,NULL在前面");
users.sort(comparing(User::getAge, Comparator.nullsLast(Integer::compareTo)).thenComparing(User::getSex, Comparator.nullsLast(String::compareTo)).reversed());
users.forEach(System.out::println);

http://chatgpt.dhexx.cn/article/xBf8NsNI.shtml

相关文章

APP移动测试用例总结,总有你要用到的

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 总结 重点&#xff1a;配套学习资料和…

设计水杯,门锁的测试用例

测试用例公式&#xff1a; 功能测试 界面测试 性能测试 兼容性测试 易用性测试 安全测试 一般用脑图或者Excel来编写测试用例 百度脑图 - 便捷的思维工具 水杯的测试用例&#xff1a; 门锁的测试用例&#xff1a; 测试用例越多越好吗&…

APP 测试用例(大部分 APP 通用)

APP 测试用例 根据 场景设计法 来设计测试用例 安装与卸载权限设置软件更新登录与注册网络环境运行日历控件异常测试兼容性测试

在线音乐播放器测试用例

登录功能测试用例 当用户输入正确的用户名和密码时,方可登录成功,否则,会给出相应得提示。 上传音乐测试用例 用户选择上传的音乐后缀是.mp3时,才能上传成功。 查询音乐测试用例 查询音乐支持指定名称查询和模糊匹配查询。 安全测试 安全测试作为系统测试的主要部分&#xff0c…

APP移动测试用例总结

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 结语 前言 在我们的测试工作中&#xff0c;对于某…

手机app测试用例怎么写?手机app测试点有哪些?没有水分,错过绝对后悔

目录 一、前言 二、安装卸载测试点 安装测试 卸载测试 三、登录注册测试点 登录测试点 注册测试点 四、更新推送测试点 数据更新 消息推送 五、还有易用性&#xff0c;兼容性&#xff0c;安全性太多了&#xff01; 一、前言 在当今竞争激烈的市场上一个APP的成功离不…

淘宝APP购物车测试用例

淘宝APP购物车测试用例 淘宝购物车界面界面测试&#xff1a; 1、打开页面后&#xff0c;页面显示是否完整&#xff0c;页面布局是否合理。&#xff08;1&#xff09;标题、宝贝数显示、降价提示、管理。&#xff08;2&#xff09;字体大小、字体格式。 2、不同店家的商品在不…

手机app测试用例怎么写?手机app测试点有哪些?

随着科技的发展&#xff0c;购物、旅游、支付等日常衣食住行活动都离不开手机&#xff0c;由此衍生了很多APP。比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 APP测试…

app测试用例

app主要测试类型&#xff1a;安全性、易用性、性能、安装卸载、注册登录、兼容性、更新推送。 1、安全性&#xff1a;权限测试、安装卸载安全性、密码显示存储及长度要求、数据安全性、敏感数据的处理、备份与恢复要求、安全提示要求、数据删除要求、个人信息的使用要求、应用…

手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!

目录 一、前言 二、安装卸载测试点 安装测试 卸载测试 三、登录注册测试点 登录测试点 注册测试点 四、更新推送测试点 数据更新 消息推送 五、还有易用性&#xff0c;兼容性&#xff0c;安全性太多了&#xff01; 一、前言 在当今竞争激烈的市场上一个APP的成功离不…

牛顿法与拟牛顿法学习笔记(三)DFP 算法

机器学习算法中经常碰到非线性优化问题&#xff0c;如 Sparse Filtering 算法&#xff0c;其主要工作在于求解一个非线性极小化问题。在具体实现中&#xff0c;大多调用的是成熟的软件包做支撑&#xff0c;其中最常用的一个算法是 L-BFGS。为了解这个算法的数学机理&#xff0c…

拟牛顿法 分析与推导

转自 http://www.cnblogs.com/liuwu265/p/4714396.html &#xff0c;侵删 网上查拟牛顿法的推导&#xff0c;找到一个感觉比较容易读懂的&#xff0c;保存下来 针对牛顿法中海塞矩阵的计算问题&#xff0c;拟牛顿法主要是使用一个海塞矩阵的近似矩阵来代替原来的还塞矩阵&…

优化算法——拟牛顿法之BFGS算法

一、BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法&#xff0c;是由Broyden&#xff0c;Fletcher&#xff0c;Goldfarb&#xff0c;Shanno四个人分别提出的&#xff0c;故称为BFGS校正。 同DFP校正的推导公式一样&#xff0c;DFP校正见博文“ 优化算法——拟牛顿法之DFP算法…

牛顿法的matlab实现

简介&#xff1a;牛顿法是用来求解无约束优化问题的&#xff0c;它的基本思想是用迭代点xk处的一阶导数和二阶导数对目标函数进行二次函数近似&#xff0c;然后把二次模型的极小点作为新的迭代点&#xff0c;不断重复这一过程&#xff0c;直至满足精度的近似极小点。 这里有必…

最优化方法:牛顿迭代法和拟牛顿迭代法

http://blog.csdn.net/pipisorry/article/details/24574293 基础 拐点 若曲线图形在一点由凸转凹&#xff0c;或由凹转凸&#xff0c;则称此点为拐点。直观地说&#xff0c;拐点是使切线穿越曲线的点。 拐点的必要条件&#xff1a;设 f ( x ) {\displaystyle f(x)} 在 ( a , b…

Newton法(牛顿法 Newton Method)

平时经常看到牛顿法怎样怎样&#xff0c;一直不得要领&#xff0c;今天下午查了一下维基百科&#xff0c;写写我的认识&#xff0c;很多地方是直观理解&#xff0c;并没有严谨的证明。在我看来&#xff0c;牛顿法至少有两个应用方向&#xff0c;1、求方程的根&#xff0c;2、最…

牛顿法与拟牛顿法学习笔记(四)BFGS 算法

机器学习算法中经常碰到非线性优化问题&#xff0c;如 Sparse Filtering 算法&#xff0c;其主要工作在于求解一个非线性极小化问题。在具体实现中&#xff0c;大多调用的是成熟的软件包做支撑&#xff0c;其中最常用的一个算法是 L-BFGS。为了解这个算法的数学机理&#xff0c…

梯度下降、牛顿法、拟牛顿法

介绍 在向量微积分中&#xff0c;标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快的方向&#xff0c;梯度的长度是这个最大的变化率。更严格的说&#xff0c;从欧几里得空间Rn到R的函数的梯度是在Rn某一点最佳的线性近似。 在判别式模型中&#xff0c;我们…