首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Collectors.toMap空指针问题

Collectors.toMap空指针问题

作者头像
阿超
发布2022-08-17 21:48:53
发布2022-08-17 21:48:53
91800
代码可运行
举报
文章被收录于专栏:快乐阿超快乐阿超
运行总次数:0
代码可运行

社会上崇敬名人,于是以为名人的话就是名言,却忘记了他所以得名是那一种学问和事业。 —— 鲁迅

对于Collectors.toMap,我们使用时如果value为空,则会抛出空指针,因为底层调用的Map.merge函数

如果我们想避免该问题,就可以使用collect去处理,例如我给hutool提交的这个PR一样

原先:

代码语言:javascript
代码运行次数:0
运行
复制
StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, value, (l, r) -> l));

现在:

代码语言:javascript
代码运行次数:0
运行
复制
StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, E v) -> m.put(key.apply(v), value.apply(v)), HashMap::putAll);

完整函数:

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * @param collection 需要转化的集合
 * @param key        E类型转化为K类型的lambda方法
 * @param value      E类型转化为V类型的lambda方法
 * @param isParallel 是否并行流
 * @param <E>        collection中的泛型
 * @param <K>        map中的key类型
 * @param <V>        map中的value类型
 * @return 转化后的map
 */
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也同理

原来:

代码语言:javascript
代码运行次数:0
运行
复制
StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));

现在:

代码语言:javascript
代码运行次数:0
运行
复制
StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, V v) -> m.put(Opt.ofNullable(v).map(key).get(), v), HashMap::putAll);

完整代码:

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 将collection转化为类型不变的map<br>
 * <B>{@code Collection<V>  ---->  Map<K,V>}</B>
 *
 * @param collection 需要转化的集合
 * @param key        V类型转化为K类型的lambda方法
 * @param isParallel 是否并行流
 * @param <V>        collection中的泛型
 * @param <K>        map中的key类型
 * @return 转化后的map
 */
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值,故 修复了该问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档