当前位置: 首页 > news >正文

关于java8里边Collectors.toMap()的空限制

在使用stream操作把list转为map的时候报了一个NPE,但是实际上HashMap是支持key或者value为null的,很是疑惑,查了一下发现是java8设计时候的一个限制。

Map<Long, Long> exportStoreSupervisorIdMap = exportStoreList.stream().collect(Collectors.toMap(PhysicalStorePO::getId, PhysicalStorePO::getSupervisorId, (K1, K2) -> K1));

有一个对象的supervisorId是null,结果npe了。
这是因为在使用 Collectors.toMap() 时,如果值为 null,会抛出 NullPointerException。这是 Java 8 的一个限制。

有几种解决方案:

1.使用 Collectors.toMap 的另一个重载方法,显式指定 HashMap::new

Map<Long, Long> exportStoreSupervisorIdMap = exportStoreList.stream().collect(Collectors.toMap(PhysicalStorePO::getId,PhysicalStorePO::getSupervisorId,(k1, k2) -> k1,HashMap::new));

2.先过滤掉 null 值

Map<Long, Long> exportStoreSupervisorIdMap = exportStoreList.stream().filter(store -> store.getSupervisorId() != null).collect(Collectors.toMap(PhysicalStorePO::getId,PhysicalStorePO::getSupervisorId,(k1, k2) -> k1));

3.使用普通的 for 循环

Map<Long, Long> exportStoreSupervisorIdMap = new HashMap<>();
for (PhysicalStorePO store : exportStoreList) {exportStoreSupervisorIdMap.put(store.getId(), store.getSupervisorId());
}

4.使用自定义的收集器方法

Map<Long, Long> exportStoreSupervisorIdMap = exportStoreList.stream().collect(HashMap::new,(map, store) -> map.put(store.getId(), store.getSupervisorId()),HashMap::putAll);

推荐使用第 1 或第 2 种方案,取决于你是否需要保留 null 值:

如果需要保留 null 值,使用方案 1
如果不需要 null 值,使用方案 2
这个问题的根本原因是 Collectors.toMap 的实现不支持 null 值,这是一个设计决定。如果你确实需要包含 null 值,最好明确指定使用 HashMap 作为实现。

http://www.dtcms.com/a/291214.html

相关文章:

  • 使用 PyTorch 的 torchvision 库加载 CIFAR-10 数据集
  • python 中if/elif/else 是如何构建程序逻辑的?
  • 【初识数据结构】CS61B中的最小生成树问题
  • LLaMA-Factory 微调可配置的模型基本参数
  • jcmd用法总结
  • 完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用
  • 83、形式化方法
  • Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录
  • 【CAN】01.CAN简介硬件电路
  • 视网膜分支静脉阻塞(BRVO)及抗VEGF治疗的多模态影像学研究
  • 同步与异步?从一个卡顿的Java服务说起
  • 文字检测到文字识别
  • 如何用 Z.ai 生成PPT,一句话生成整套演示文档
  • 自反馈机制(Self-Feedback)在大模型中的原理、演进与应用
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • 【ROS1】07-话题通信中使用自定义msg
  • (9)机器学习小白入门 YOLOv:YOLOv8-cls 技术解析与代码实现
  • 选择排序 冒泡排序
  • LinkedList与链表(单向)(Java实现)
  • android studio 远程库编译报错无法访问远程库如何解决
  • 算法提升之字符串回文问题-(马拉车算法)
  • Java基础教程(011):面向对象中的构造方法
  • 模拟高负载测试脚本
  • Flink框架:keyBy实现按键逻辑分区
  • 250kHz采样率下多信号参数设置
  • mysql-5.7 Linux安装教程
  • 无人机报警器技术要点与捕捉方式
  • Anaconda 路径精简后暴露 python 及工具到环境变量的配置记录 [二]
  • Linux学习之Linux系统权限
  • scratch音乐会开幕倒计时 2025年6月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析