putIfAbsent,一个字段为空的话,将该字段设置为指定值

我觉得开发中应该经常有这种需求,比如从数据库读出来条记录,如果这个记录的nickName字段为null,那我们就为其指定默认昵称

啥也不说,看代码代码,两种方法

方法一:原始思路

方法二:借助java8固有的putIfAbsent(k,v)

1)方法一,按照思路来嘛,先读,再判断,nickName到底有没有值,如果为null,为其指定

@Test
    public void putIfAbsentTest(){
        Map map = new HashMap<>();
        //这里没有做数据库连接,直接把name的value设为null,你就当做从数据库读出来一个Map的结果集,
        // 其中nickName字段的值为null,效果一样的
        map.put("nickName",null);
        System.out.println(map.get("nickName"));
        if(map.get("nickName") == null){
            map.put("nickName","snail");
        }
        System.out.println(map.get("nickName"));
    }

 

2)方法二,java8的map提供一个方法putIfAbsent(),absent是空缺,缺席的意思,先看源码

default V putIfAbsent(K key, V value) {
        V v = get(key);
       //这里需要清除,v为nulll存在两种情况1:k存在,但是v为null
      //2:k根本不存在,所以对应的v一定是null
     //所以这个方法执行的效果是,k存在但是v为null,将v赋值为指定的v
    //或者,k-v根本不存在,那就直接put(k,v)
        if (v == null) {
            v = put(key, value);
        }

        return v;//v不为null,直接返回原来的v
    }

源码分析过了,那我们这个问题就好解决了

 @Test
    public void putIfAbsentTest(){
        Map map = new HashMap<>();
        //这里没有做数据库连接,直接把name的value设为null,你就当做从数据库读出来一个Map的结果集,
        // 其中nickName字段的值为null,效果一样的
        map.put("nickName",null);
        System.out.println("最开始,没有昵称:"+map.get("nickName"));
        map.putIfAbsent("nickName","coisini");
        System.out.println("设置昵称为coisini: "+map.get("nickName"));
        map.putIfAbsent("nickName","snail");
        System.out.println("设置昵称为snail不成功,因为昵称不为null"+ map.get("nickName"));
        map.putIfAbsent("phone","12345678");
        System.out.println("之前不存在k为phone的元素,执行putIfAbsent会自动创建"+map.get("phone"));
    }

啰嗦了半天,其实就是讲解putIfAbsent(k,v)这个方法,好啦自己试试吧

 

posted on 2018-10-16 16:57  爪哇玛咖  阅读(610)  评论(0编辑  收藏  举报

导航