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

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

java 复制代码
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

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

2.先过滤掉 null 值

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

3.使用普通的 for 循环

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

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

java 复制代码
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 作为实现。

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415911 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员15 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus