当其中一个值为 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中文网其他相关文章!