Java:Map的getOrDefault()方法结果仍为null

1、问题

  今天在工作中遇到一个问题,在一个通用的数据处理方法中,方法会从一个Map类型参数通过key里获取对象value,但方法的调用者并不都会传递value实例,若没有获取到value则需要初始化一个,处理方式是调用了Map的getOrDefault()方法,这是一种常见的处理方式,但没想到后面还是发生了空指针。如下图所示:
Java:Map的getOrDefault()方法结果仍为null_第1张图片
  在我以前的实践中,当获取不到对应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);
    }

你可能感兴趣的:(开发日记,java,开发语言)