在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不存在的键时,Map会返回null值。这在某些情况下可能会导致错误,因此Java 8引入了一个新的方法getOrDefault(),该方法可用于解决这个问题。
getOrDefault()方法的语法如下:
该方法接受两个参数:要查找的键和默认值。如果键存在,则返回与该键关联的值,否则返回指定的默认值。
需要注意的是,如果我们设置的默认值不是Map中存储的值的类型,则会抛ClassCastException异常。
default V getOrDefault(Object key, V defaultValue) {
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
当使用Map集合时,如果我们尝试访问一个不存在的键,则会返回一个null值,这在某些情况下可能会导致错误。使用Map的getOrDefault()方法可以解决这个问题。
使用getOrDefault()方法
public static void main(String[] args) {
// 创建一个Map对象
Map<String, Object> map = new HashMap<>();
// 添加键值对到Map中
map.put("a", "1");
map.put("c", null);
// 获取键为【a】的值
System.out.println(map.getOrDefault("a", "aaa"));
// 获取键为【b】的值
System.out.println(map.getOrDefault("b", "2"));
// 获取键为【c】的值
System.out.println(map.getOrDefault("c", "3"));
}
运行结果
1
2
null
在上面的示例中
由于键”a“存在于Map中,所以返回”a“的键值为1
由于键”b“不存在于Map中,所以返回默认值为2
由于键”c“存在于Map中,所以返回”c“的键值为null
使用getOrDefault()方法已经满足了大多数情况的使用
但是你会发现另外一个问题,例如键”c“,当map的值为null时,获取键值依旧是返回null,一些情况下仍会造成错误异常
因为:getOrDefault的默认值的生效条件并不是get的值为null,而是containsKey的结果为false
解决这个问题可以使用MapUtils.getXXX(Map<K, V> map, K key, V defaultValue),
我们的Map类型是<String, Object>所有这里我们使用MapUtils.getObject()方法,此方法源码如下
第一个参数:要获取键值的map集合;第二个参数:要获取键值的键key;第三个参数:当map的值为null时,使用的默认值
public static <K, V> V getObject(Map<K, V> map, K key, V defaultValue) {
if (map != null) {
V answer = map.get(key);
if (answer != null) {
return answer;
}
}
return defaultValue;
}
使用MapUtils.getObject()方法,还是上面的例子
import org.apache.commons.collections4.MapUtils;
public static void main(String[] args) {
// 创建一个Map对象
Map<String, Object> map = new HashMap<>();
// 添加键值对到Map中
map.put("a", "1");
map.put("c", null);
// 获取键为【a】的值
System.out.println(map.getOrDefault("a", "aaa"));
// 获取键为【b】的值
System.out.println(map.getOrDefault("b", "2"));
// 获取键为【c】的值
System.out.println(map.getOrDefault("c", "3"));
System.out.println(MapUtils.getObject(map, "c", "3"));
}
运行结果
1
2
null
3
在上面的示例中
map.getOrDefault方法获取map键为“c”的值,值为:null
MapUtils.getObject()方法获取map键为“c”的值,值为null则使用默认值“3”
综上测试,map.getOrDefault()方法和MapUtils.getObject()方法均可避免一些键值异常的发生,具体使用请参照具体业务使用,有时map的value为null就是要取null,有时候则需要设置默认值