罪魁祸首就是HashMap的merge方法了,它的第一行就是这个:
if (value == null)
throw new NullPointerException();
复制代码
为什么会调merge方法呢,toMap方法调的
public static >
Collector toMap(Function super T, ? extends K> keyMapper,
Function super T, ? extends U> valueMapper,
BinaryOperatormergeFunction,
Supplier mapSupplier) {
BiConsumer 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 collect(Supplier supplier,
BiConsumer accumulator,
BiConsumer 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
如果觉得《java map 空指针异常_Java8使用Collectors toMap 当value为null时报空指针异常》对你有帮助,请点赞、收藏,并留下你的观点哦!