关于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 作为实现。

相关推荐
Fuyo_11191 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
Sarvartha1 小时前
Date、LocalDate、LocalTime、LocalDateTime、DateTimeFormatter类
java
阿俊-全栈开发2 小时前
LikeShop 多商户 Java 版商城微服务模块拆分与部署架构演进实践
java·微服务·架构·likeshop开源商城·多商户源码
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
香蕉大香蕉(06敬畏市场)3 小时前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
LaughingZhu3 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
niucloud-admin3 小时前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
IT枫斗者枫哥4 小时前
CompletableFuture失败后返回空列表:异常没了,业务含义也变了
java·后端
知识搬运临时工4 小时前
一个模板把 AEM 拖进 Full GC 死亡螺旋:300% CPU、7 GB 堆、310 万行堆栈
java·aws