首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Collectors toMap,当value为null时空指针报错

Collectors toMap,当value为null时空指针报错

作者头像
似水的流年
发布2021-06-17 18:07:49
1.4K0
发布2021-06-17 18:07:49
举报
文章被收录于专栏:电光石火电光石火

罪魁祸首就是HashMap的merge方法了,它的第一行就是这个:

if (value == null)
            throw new NullPointerException();

为什么会调merge方法呢,toMap方法调的

public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }

那么怎么解决呢? 既然时merge方法造成的,那就不调merge方法。 我们用自己定义的accumulator,用Stream的另一个collect方法

<R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

这个方法上面的注释写了一段这个, 前两个参数干什么用的就很清楚了,第三个参数时并行计算用来组合结果的,所以用HashMap的putAll就好了

R result = supplier.get();
for (T element : this stream)
     accumulator.accept(result, element);
 return result;

所以解决办法的代码大概就是这样的

params.stream().collect(LinkedHashMap::new, (m, v) -> m.put(v.getParam(), v.getParamValue()), LinkedHashMap::putAll);

据说这个问题java9就修复了,所以也可以尝试升级jdk

作者:l-qiang 链接:https://juejin.cn/post/6844903934855741447 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档