美文网首页
Java8使用Collectors.toMap,当value为n

Java8使用Collectors.toMap,当value为n

作者: 二十五_0415 | 来源:发表于2019-08-19 16:48 被阅读0次

    罪魁祸首就是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

    相关文章

      网友评论

          本文标题:Java8使用Collectors.toMap,当value为n

          本文链接:https://www.haomeiwen.com/subject/hbcesctx.html