java map 空指针异常_Java8使用Collectors toMap,当value为null时报空指针异常
罪魁禍?zhǔn)拙褪荋ashMap的merge方法了,它的第一行就是這個(gè):
if (value == null)
throw new NullPointerException();
復(fù)制代碼
為什么會(huì)調(diào)merge方法呢,toMap方法調(diào)的
public static >
Collector toMap(Function super T, ? extends K> keyMapper,
Function super T, ? extends U> valueMapper,
BinaryOperator mergeFunction,
Supplier mapSupplier) {
BiConsumer accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
復(fù)制代碼
那么怎么解決呢?
既然時(shí)merge方法造成的,那就不調(diào)merge方法。
我們用自己定義的accumulator,用Stream的另一個(gè)collect方法
R collect(Supplier supplier,
BiConsumer accumulator,
BiConsumer combiner);
復(fù)制代碼
這個(gè)方法上面的注釋寫(xiě)了一段這個(gè), 前兩個(gè)參數(shù)干什么用的就很清楚了,第三個(gè)參數(shù)時(shí)并行計(jì)算用來(lái)組合結(jié)果的,所以用HashMap的putAll就好了
R result = supplier.get();
for (T element : this stream)
accumulator.accept(result, element);
return result;
復(fù)制代碼
所以解決辦法的代碼大概就是這樣的
params.stream().collect(LinkedHashMap::new, (m, v) -> m.put(v.getParam(), v.getParamValue()), LinkedHashMap::putAll);
復(fù)制代碼
據(jù)說(shuō)這個(gè)問(wèn)題java9就修復(fù)了,所以也可以嘗試升級(jí)jdk
總結(jié)
以上是生活随笔為你收集整理的java map 空指针异常_Java8使用Collectors toMap,当value为null时报空指针异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。