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,流中具有空值的任何键都具有空值。
注意事项
需要注意的是,此解决方法有以下注意事项:
如果这些考虑因素对于您的用例来说是不可接受的,您可能需要考虑替代方案方法,例如使用不同的 Collector 实现或恢复到普通的旧 for 循环。
以上是为什么 Collectors.toMap 会抛出带有 Null 条目值的 NullPointerException?的详细内容。更多信息请关注PHP中文网其他相关文章!