Java——Map.getOrDefault方法和MapUtils.getXXX()详解
  eq2guJvCesUz 2023年11月28日 38 0

在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,有时候则需要设置默认值


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月28日 0

暂无评论

eq2guJvCesUz