1、问题
今天在工作中遇到一个问题,在一个通用的数据处理方法中,方法会从一个Map类型参数通过key里获取对象value,但方法的调用者并不都会传递value实例,若没有获取到value则需要初始化一个,处理方式是调用了Map的getOrDefault()方法,这是一种常见的处理方式,但没想到后面还是发生了空指针。如下图所示:
在我以前的实践中,当获取不到对应key的value时,也即value = null时,获取到的就会是指定的默认对象,但实际情况不是这样,我们来看看原因,首先是调用者代码:
Map<String, String> map = new HashMap<>();
map.put("key", null);
processing(map);
可以看到,“key” 是指定了value为 null,再看看getOrDefault()方法的底层逻辑:
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
原来只要是对应的key在Map当中,哪怕对应的value是 null,那么也会将null直接返回,而不是返回默认值。这算是一个小坑吧,之前的应用当中,一直是在没有放入key的情况下,使用了该方法,场景也都是在获取到的value = null时去给默认值,也就单纯以为只要获取到的value是null就会使用默认值
2、解决办法
在上面的例子中,我的目的是当value为null时,给一个默认值,错用了getOrDefault()方法,那么想要实现我要的效果,有什么优雅的办法吗?在jdk1.8后可以使用下面的方法来优雅实现:
public static void processing(Map<String,String> map) {
// 当获取到的对象为null时,使用orElse()方法指定默认值
String s = Optional.ofNullable(map.get("key")).orElse("abc");
System.out.println(s);
}