阿超
>
Collectors.toMap空指针问题
社会上崇敬名人,于是以为名人的话就是名言,却忘记了他所以得名是那一种学问和事业。 —— 鲁迅
对于Collectors.toMap
,我们使用时如果value
为空,则会抛出空指针,因为底层调用的Map.merge
函数
如果我们想避免该问题,就可以使用collect
去处理,例如我给hutool
提交的这个PR
一样
原先:
1
| StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, value, (l, r) -> l));
|
现在:
1
| StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, E v) -> m.put(key.apply(v), value.apply(v)), HashMap::putAll);
|
完整函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public static <E, K, V> Map<K, V> toMap(Collection<E> collection, Function<E, K> key, Function<E, V> value, boolean isParallel) { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } return StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, E v) -> m.put(key.apply(v), value.apply(v)), HashMap::putAll); }
|
当然,对于hutool
中另一个函数CollStream.toIdentityMap
也同理
原来:
1
| StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
|
现在:
1
| StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, V v) -> m.put(Opt.ofNullable(v).map(key).get(), v), HashMap::putAll);
|
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public static <V, K> Map<K, V> toIdentityMap(Collection<V> collection, Function<V, K> key, boolean isParallel) { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } return StreamUtil.of(collection, isParallel) .collect(HashMap::new, (HashMap<K, V> m, V v) -> m.put(Opt.ofNullable(v).map(key).get(), v), HashMap::putAll); }
|
实际发生场景如下:我查询出用户与好友关联关系,并想获取Map<好友编号, 好友备注>
时,使用该函数导致NPE
,因为默认使用的
Map.merge
不允许空值,而我此处场景下,允许未给好友备注,也就是允许null
值,故 修复了该问题