java.util.Map getOrDefault的陷阱

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

先上代码。

Map<String, String> 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<? super K, ?> 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<? super K, ?> map, final K key, final Xxx defaultValue)来安全地获取非null值吧!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值