首页  >  文章  >  Java  >  为什么当值为 Null 时 Collectors.toMap 会抛出 NullPointerException?

为什么当值为 Null 时 Collectors.toMap 会抛出 NullPointerException?

Susan Sarandon
Susan Sarandon原创
2024-11-10 15:32:03444浏览

Why Does Collectors.toMap Throw a NullPointerException When Values Are Null?

Collectors.toMap 中具有 Null 条目值的 NullPointerException

当其中一个值为 null 时,Collectors.toMap 会引发 NullPointerException。这种行为令人惊讶,因为映射可以包含空值而不会出现任何问题。为什么 Collectors.toMap 有此限制?

此限制的原因是 Collectors.toMap 内部使用了 HashMap。 HashMap 不允许键为空值,但允许值为空值。但是,Collectors.toMap 假设所有值都是非空的,如果违反此假设,它会抛出 NullPointerException。

Java 8 没有提供解决此问题的好方法。您可以恢复为普通的旧 for 循环,也可以使用如下所示的解决方法:

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

此解决方法使用将供应商作为参数的 HashMap 构造函数。如果流为空,则供应商用于创建新的地图实例。在这种情况下,供应商创建一个新的 HashMap,默认容量为 16,负载因子为 0.75。

然后,解决方法使用 putAll 方法将流中的所有元素添加到映射中。 putAll 方法将流中的元素合并到映射中,用相同的键替换任何现有元素。

此解决方法不如 Collectors.toMap 方法干净,但它有效。它还保留流中元素的顺序,而 Collectors.toMap 则不这样做。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn