行业资讯 2025年08月6日
0 收藏 0 点赞 833 浏览 1582 个字
摘要 :

文章目录 Collectors.toMap HashMap.merge空指针异常原因 解决办法 最近线上Java程序运行有个报错error,具体类似如下NullPointerException空指针异常,主要发生在Stre……




最近线上Java程序运行有个报错error,具体类似如下NullPointerException空指针异常,主要发生在Stream流中的调用Collectors.toMap方法中,提示HashMap.merge时出现空指针异常:

java.lang.NullPointerException
    at java.util.HashMap.merge(HashMap.java:1225)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.sf.hlcs.sda.Test01.test1(Test01.java:28)

这里是模拟的演示代码:

@Test
public void test1() {
    Person person = new Person();
    person.setAge(null);
    person.setName(\"panziye\");
    List<Person> personList = new ArrayList<>();
    personList.add(person);
    personList.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
}
@Data
class Person{
    private String name;
    private String age;
}

Collectors.toMap HashMap.merge空指针异常原因

原因其实很简单,就是因为Collectors.toMap是对应的value值为null导致的。我们直接看下Collectors.toMap相关源码:Stream Collectors.toMap抛HashMap.merge空指针异常

我们发现Collectors.toMap中会调用merge方法,当value为null时就直接抛空指针异常了。

解决办法

我们使用filter过滤null值后再去collect,比如以上的代码优化如下:

personList.stream().filter(e -> e.getAge() != null).collect(Collectors.toMap(Person::getName, Person::getAge));

这样就轻松解决了HashMap.merge空指针异常问题,但是如果你想保留为null的值,那就可以使用Optional:

// 使用 Optional 来获取值,若为null,则返回默认值\"\"
    personList.stream().collect(Collectors.toMap(Person::getName,  p->Optional.ofNullable(p.getAge()).orElse(\"\")));

当然还有一种办法,就是直接调用map中的put()方法,而不使用toMap()中默认的merge()方法,我们可以不使用toMap()方法,直接在collect中构建map,类似如下:

personList.stream().collect(
            HashMap::new,
            (m,node) -> m.put(node.getName(),node.getAge()),
            HashMap::putAll
);

以上就是Stream Collectors.toMap抛HashMap.merge空指针异常的原因分析及相关解决办法,希望对你有帮助!

 

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9213.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号