【发布时间】:2019-08-06 16:20:49
【问题描述】:
所以我尝试使用 Java 8 流 Collectors.toMap 将元素添加到新创建的地图中。
要创建的 Map 的某些键可能包含空值。这对于 HashMap 来说是完全可以接受的,当我使用流 forEach 添加成员时,它按预期工作:
final Map<String, Method> rMap = new HashMap<> ( );
msgRouteProps.entrySet ( )
.stream ( )
.forEach (entry -> rMap.put (entry.getKey ( ),
ReflectionUtil.getNamedMethod (processor, entry.getValue ( ))));
msgRouteProps 是一个 Map,其中键和值都是非空的。请注意,ReflectionUtil.getNamedMethod() 调用可能会返回 null,我希望将其放入生成的 Map 中。
所以我想探索如何用 Collectors.toMap() 方法做同样的事情,这样流操作就可以返回新创建的地图,而无需我直接创建它。
所以我尝试了以下方法:
Map<String, Method> rMap =
msgRouteProps.entrySet ( )
.stream ( )
.collect (Collectors.toMap (Map.Entry::getKey,
(e) -> ReflectionUtil.getNamedMethod (processor, e.getValue ( ))));
在我看来,这个 应该 以相同的方式工作,但不幸的是,它因空指针异常而失败。似乎 Collectors.toMap 方法调用了不允许传递空值的 HashMap 的 merge() 方法。对我来说奇怪的是,我真的不认为在这种情况下应该调用合并,因为原始映射中的键都是唯一的。鉴于此,我假设可以通过调用地图的 put() 方法将值简单地添加到新地图中,这将允许空值。
我在这里做错了什么,或者有解决方法吗?或者这只是使用 Collectors.toMap 时的预期行为?
【问题讨论】:
标签: java-stream