首页 > Java > java教程 > 正文

为什么 Collectors.toMap 会抛出带有 Null 条目值的 NullPointerException?

Linda Hamilton
发布: 2024-11-11 21:44:03
原创
379 人浏览过

Why Does Collectors.toMap Throw a NullPointerException with Null Entry Values?

Collectors.toMap 中遇到空条目值的 NullPointerException

简介

在 Java 8 中Collectors.toMap 是一种从键值对流创建 Map 的便捷方法。但是,如果流中的值之一为 null,则此方法将引发 NullPointerException。这看起来很奇怪,因为 Maps 可以毫无问题地包含 null 值。

空异常的原因

此行为背后的原因是 Collectors 的默认实现。 toMap 使用 HashMap 作为底层数据结构。 HashMap 不允许键为空值,但它们允许值为空值。但是,当 Collectors.toMap 遇到键的 null 值时,它会尝试使用该值的默认值(即 null),这会导致 NullPointerException。

Java 8 解决方案

要在 Java 8 中解决此问题,我们可以使用一种解决方法,包括手动创建 HashMap 并使用流中的键值对填充它:

Map<Integer, Boolean> collect = list.stream()
        .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
登录后复制

This解决方法不是特别优雅,但它会产生预期的结果:包含流中的键值对的 Map,流中具有空值的任何键都具有空值。

注意事项

需要注意的是,此解决方法有以下注意事项:

  • 与 Collectors.toMap 不同,如果您多次使用相同的键,它会默默地替换值。
  • 它使用 HashMap 作为底层数据结构,这可能并不适合所有场景。

如果这些考虑因素对于您的用例来说是不可接受的,您可能需要考虑替代方案方法,例如使用不同的 Collector 实现或恢复到普通的旧 for 循环。

以上是为什么 Collectors.toMap 会抛出带有 Null 条目值的 NullPointerException?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板