super365体育官网下载

java.util.Map getOrDefault的陷阱

发布时间 2025-09-30 20:27:13 作者 admin 阅读 912

最近使用Java 8新增加的java.util.Map.getOrDefault()方法,结果却发现是一个大坑。

先上代码。

Map map = Maps.newHashMap();

map.put("test", null);

System.out.println(map.getOrDefault("test", "default"));

System.out.println(map.getOrDefault("test", "default") == null);

System.out.println(org.apache.commons.collections4.MapUtils.getString(map, "test", "default"));

再看执行结果。

接下来开始分析。根据方法getOrDefault(Object key, V defaultValue),我天真地认为该方法是先从Map中get(key),如果获取到的值为null,那么就会取defaultValue,类似于org.apache.commons.collections4.MapUtils.getString(final Map map, final K key, final String defaultValue)。直到使用过后遇到了NPE时,我才认真看了下源码,源码如下。

源码的这个逻辑不是一般得坑人啊!从Map中get(key)的值不为null或者包含key时,就返回get(key)的值。但是这里有一个问题,Map中包含某个key时,该key对应的值也是可以为null的!本来想用getOrDefault来避免null并设置默认值的,结果还是有可能返回null并可能造成NPE问题。

结论:java.util.Map.getOrDefault() 方法并不能很贴切实际业务的使用,还是使用MapUtils.getXxx(final Map map, final K key, final Xxx defaultValue)来安全地获取非null值吧!

相关推荐

世南美预

巴西近10场正赛主场7胜2平1负,表现出色。 巴西近5场正赛连续进球,且场均进球达2.0球。 巴西10场正赛场均失球小于1球,其中3场零封对手。 巴

08-04 分类 365bet世界杯

原神琥牢山怎么进

原神琥牢山如何解密?原神游戏中有着各种各样的任务,很多小伙伴不清楚琥牢山怎么解,今天就为大家带来原神琥牢山解密方法,感兴趣的玩

09-11 分类 365bet世界杯

苹果7 puls

Copyright© 2020-2025深圳市云网万店电子商务有限公司版权所有| 苏公网安备 32010202010078号| 粤ICP备2021027996号 云网万店增值电信业务许可证-合字B2-202

07-27 分类 super365体育官网下载

教化妆的app排行

爱美是女人的天性,化妆也逐渐成为了女生的必备技能,但是没有女孩是天生会化妆的,以前大家都是通过摸索、学习、练习才逐渐找到最适合

07-15 分类 super365体育官网下载

升级MacOs bigsur卡进度条

升级MacOs bigsur卡进度条 MacBook air升级bigsur进度条卡剩余不到一分钟好长时间还没成功 推出macOS bigsur 之后就更新,晚上下载之后就放着让更新,

07-21 分类 365bet世界杯

腾讯和网易这一仗,是为未来十年打的

近段时间,不管大家是不是游戏迷,肯定都会知道腾讯的《元梦之星》,因为无论是刷抖音、看B站,甚至只是翻翻朋友圈,《元梦之星》的广告

07-08 分类 bte365娱乐线