news 2026/4/17 21:29:28

java中stream的Collectors.toMap常见踩坑点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java中stream的Collectors.toMap常见踩坑点

首先假定有以下测试实体类:

@Data@AllArgsConstructorpublicclassTest{privateStringname;privateIntegerage;}

一. 出现重复键

如果转换为map后可能出现重复键, 默认会抛出异常, 需指定合并策略.

List<Test>list=newArrayList<>();list.add(newTest("A",20));list.add(newTest("B",30));list.add(newTest("A",40));Map<String,Integer>map1=list.stream().collect(Collectors.toMap(Test::getName,Test::getAge));//报错: java.lang.IllegalStateException: Duplicate key 20Map<String,Integer>map2=list.stream().collect(Collectors.toMap(Test::getName,Test::getAge,(o,n)->n));//结果为: {A=40, B=30}

二. 出现null的值

如果转换为map后可能出现null的值, 会抛出异常, 需先过滤掉null值.

List<Test>list=newArrayList<>();list.add(newTest("A",20));list.add(newTest("B",30));list.add(newTest("C",null));Map<String,Integer>map1=list.stream().collect(Collectors.toMap(Test::getName,Test::getAge,(o,n)->n));//报错: java.lang.NullPointerExceptionMap<String,Integer>map2=list.stream().filter(test->Objects.nonNull(test.getAge())).collect(Collectors.toMap(Test::getName,Test::getAge,(o,n)->n));//结果为: {A=20, B=30}

三. 出现null的键

如果转换为map后可能出现null的键, 不会抛出异常.

List<Test>list=newArrayList<>();list.add(newTest("A",20));list.add(newTest("B",30));list.add(newTest(null,40));Map<String,Integer>map=list.stream().collect(Collectors.toMap(Test::getName,Test::getAge,(o,n)->n));//结果为: {null=40, A=20, B=30}

引申

Collectors.groupingBy方法如果结果可能出现null的键, 会抛异常, 需要与Collectors.toMap区分.

List<Test>list=newArrayList<>();list.add(newTest("A",20));list.add(newTest("B",30));list.add(newTest(null,40));Map<String,List<Test>>map1=list.stream().collect(Collectors.groupingBy(Test::getName));//报错: java.lang.NullPointerException: element cannot be mapped to a null key//如需要null键的分组, 可使用Optional包装.Map<Optional<String>,List<Test>>map2=list.stream().collect(Collectors.groupingBy(test->Optional.ofNullable(test.getName())));//结果: {Optional.empty=[Test(name=null, age=40)], Optional[A]=[Test(name=A, age=20)], Optional[B]=[Test(name=B, age=30)]}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:28:02

保姆级教程:在RK3588开发板上为QT5.12.8源码交叉编译并启用OpenGL ES2

保姆级教程&#xff1a;在RK3588开发板上为QT5.12.8源码交叉编译并启用OpenGL ES2 嵌入式开发中&#xff0c;图形界面的流畅渲染往往离不开硬件加速支持。对于采用RK3588这类高性能ARM处理器的开发板而言&#xff0c;通过OpenGL ES2实现QT应用的图形加速&#xff0c;能显著提升…

作者头像 李华
网站建设 2026/4/17 21:27:51

【物联网毕设】智能照明系统实战:STM32+APP+MQTT全链路开发指南

1. 项目背景与核心功能 想象一下这样的场景&#xff1a;当你走进房间&#xff0c;灯光自动亮起&#xff1b;离开时&#xff0c;系统自动关闭照明。通过手机APP&#xff0c;你可以随时查看房间光照状态&#xff0c;远程调节灯光亮度&#xff0c;甚至设置定时开关——这就是我们要…

作者头像 李华
网站建设 2026/4/17 21:23:03

Unity3D实战:动态加载与交互式PPT展示系统开发

1. 为什么要在Unity里加载PPT&#xff1f; 很多朋友第一次听说Unity能加载PPT时都会愣一下&#xff1a;这不是办公软件的功能吗&#xff1f;其实在虚拟仿真、数字孪生、在线教育这些领域&#xff0c;经常需要把传统PPT融合到3D场景里。比如我去年做的汽车展厅项目&#xff0c;客…

作者头像 李华
网站建设 2026/4/17 21:21:58

两会定调!2026年,网络安全是最值得投身的黄金赛道

两会定调&#xff01;2026 年&#xff0c;网络安全是最值得投身的黄金赛道 2026 全国两会正在进行&#xff0c;网络安全再次被摆在国家战略核心位置。从新《网络安全法》全面落地&#xff0c;到 AI 安全、数据安全、关键信息基础设施防护成为高频热词&#xff0c;政策、产业、…

作者头像 李华