Collectors.toMap 中的 Null 值:解释和 Java 8 解决方案
Java 8 的 Collectors.toMap 方法在遇到 null 时抛出 NullPointerException尽管映射允许使用 null 值作为值,但 value 作为其第二个参数。这种奇怪的行为引起了开发人员的困惑。
行为背后的原因
此行为的根本原因是 Collectors.toMap 的 OpenJDK 实现中的一个已知错误。该方法尝试使用 HashMap.merge 操作合并给定键的当前值和新值。但是,此操作无法正常处理 null 值,从而导致异常。
Java 8 解决方案
要解决此问题,您可以使用以下方法:
映射 collect = list.stream().collect(HashMap::new, (m, v) -> m.put(v.getId(), v.getAnswer()), HashMap::putAll);
此代码创建一个新的 HashMap,并使用自定义收集器通过直接调用 put 方法来填充它。这种方法允许添加空值。
其他注意事项
与 Collectors.toMap 不同,如果同一键出现多次,提供的解决方案将默默地替换值。如果不需要,您可能需要考虑评论部分中提供的替代解决方案。
通过了解 NullPointerException 背后的原因并使用解决方法,您可以在使用 Collectors.toMap 时有效处理 null 值。
以上是为什么 Collectors.toMap 会针对 Null 值抛出 NullPointerException?的详细内容。更多信息请关注PHP中文网其他相关文章!