最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決JAVA8 Collectors.toMap value為null報(bào)錯(cuò)的問題

 更新時(shí)間:2021年01月21日 17:31:17   作者:網(wǎng)癮少年徐志摩  
這篇文章主要介紹了解決JAVA8 Collectors.toMap value為null報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

2018年11月7日 17:59:27 該bug貌似在java9中修復(fù),歡迎補(bǔ)充

2019年3月19日 17:59:11 查看java11的toMap方法后,發(fā)現(xiàn)并沒有修改任何實(shí)現(xiàn)

Caused by: java.lang.NullPointerException
 java.util.HashMap.merge(HashMap.java:1224)
 java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
 java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
 java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
 java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
 java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)

原因是使用Map.merge方法合并時(shí),merge不允許value為null導(dǎo)致的

方法源碼:

default V merge(K key, V value,
  BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
 Objects.requireNonNull(remappingFunction);
 //在這里判斷了value不可為null
 Objects.requireNonNull(value);
 V oldValue = get(key);
 V newValue = (oldValue == null) ? value :
   remappingFunction.apply(oldValue, value);
 if(newValue == null) {
  remove(key);
 } else {
  put(key, newValue);
 }
 return newValue;
 }

解決方案:

Map<String,Integer> videoGiftSumVoMap=videoGiftSum.stream().collect(Collectors.toMap
(callRecodVo -> Optional.ofNullable(callRecodVo).map
(CallRecodVo::getStatdate).orElse(0),callRecodVo -> Optional.ofNullable(callRecodVo).map
(CallRecodVo::getVideogiftdiamond).orElse(0), (key1, key2) -> key2));

使用optional判斷空指針設(shè)置為null的默認(rèn)值

分析:

因沒有找到Map.merge方法為什么要檢查Value Null的相關(guān)資料和官方回答,所以做以下推斷:

Collectors.toMap可以使用ConcurrentHashMap為最終收集結(jié)構(gòu),而ConcurrentHashMap不允許Value為Null避免產(chǎn)生二義性(ConcurrentHashMap的key value不能為null,map可以?)和CAS的ABA問題,所以Map.merge為了兼容ConcurrentHashMap還有ConcurrentSkipListMap等多線程環(huán)境下使用的數(shù)據(jù)結(jié)構(gòu)和使用CAS的實(shí)現(xiàn)不允許Value為Null

其他知識(shí):key不能為null,是因?yàn)闊o法分辨是key沒找到的原因所以為null,還是key值本身就為null。–key的二義性

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評(píng)論

宁阳县| 莱芜市| 务川| 新郑市| 会理县| 新河县| 柳河县| 田林县| 定边县| 汉沽区| 克拉玛依市| 云龙县| 泸定县| 宁阳县| 峡江县| 吉首市| 临清市| 海宁市| 漳州市| 石首市| 林甸县| 宝山区| 元江| 柳江县| 盐源县| 长宁区| 临泽县| 通城县| 白城市| 苍溪县| 晋中市| 云阳县| 山东省| 双辽市| 合江县| 郯城县| 祁连县| 乐业县| 怀仁县| 和平县| 庄河市|