1. 程式人生 > >java.util.Map中的putIfAbsent、computeIfAbsent、computeIfPresent、compute基本使用

java.util.Map中的putIfAbsent、computeIfAbsent、computeIfPresent、compute基本使用

1、put

插入或覆蓋

map.put(K,V);

 

2、putIfAbsent

     以下情況插入新值

     1)key不存在

     2)key存在,但value==null

     插入新value

 

map.putIfAbsent(K,V)

//個人理解,相當於
if(!map.containsKey(K)||map.get(K)==null){
    map.put(K,V)
}

 

3、computeIfAbsent

     以下情況插入新值

     1)key不存在

     2)key存在,但value==null

     插入新value

   與putIfAbsent不同的是,當插入的value==null時,computeIfAbsent是不做插入的,而putIfAbsent做插入。

map.computeIfAbsent(K,v->{return new Object();});


//個人理解,相當於
if(!map.containsKey(K)||map.get(K)==null){
    if(V!=null){
        map.put(K,V);
    }else{
        
    }
}

 

4、computeIfPresent

    只有key存在才做操作

      1)新value != null,覆蓋原值

      2)新value == null,移除對應的key

map.computeIfPresent(K,(k,v)->{return new Object();});


//個人理解,相當於
if(map.containsKey(K)){
    if(V!=null){
        map.put(K,V);
    }else{
        map.remove(K);
    }
}

 

5、compute

    1)新value != null,有該key的值覆蓋,無則插入

    2)新value == null,無該key什麼都不做,有則移除

map.putIfAbsent(K,V);

//個人理解,相當於

if(V!=null){
    map.put(K,V);
}else{
    if(map.containsKey(K)){
        map.remove(K);
    }else{
        
    }
}

 

測試用例:


    @Test
    public void test29(){
        Map<String,String> mm=new HashMap<>();
        mm.putIfAbsent("key1","val1");
        mm.putIfAbsent("key11",null);
        mm.putIfAbsent("key11","val11");
        mm.putIfAbsent("key11","val12");
        mm.putIfAbsent("key111",null);
        mm.putIfAbsent("key112",null);

        mm.computeIfAbsent("key2",v->{return "val2";});
        mm.computeIfAbsent("key22",v->{return null;});
        mm.computeIfAbsent("key22",v->{return "val22";});
        mm.computeIfAbsent("key22",v->{return "val23";});
        mm.computeIfAbsent("key222",v->{return null;});
        mm.computeIfAbsent("key112",v->{return "val112";});

        mm.computeIfAbsent("key3",v->{return "val3";});
        mm.computeIfAbsent("key4",v->{return "val4";});
        mm.computeIfAbsent("key5",v->{return "val5";});
        mm.computeIfAbsent("key5",v->{return "val555";});
        mm.computeIfAbsent("key6",v->{return null;});
        printMap(mm);
        System.out.println();

        mm.computeIfPresent("key1",(k,v)->{return "test1";});
//        mm.put("key1",null);
        mm.computeIfPresent("key100",(k,v)->{return "Test2";});
        mm.computeIfPresent("key3",(k,v)->{return null;});

        
        mm.compute("key4",(k,v)->{return "Test3";});
        mm.compute("key5",(k,v)->{return null;});
        mm.compute("key55",(k,v)->{return null;});
        mm.compute("key555",(k,v)->{return "val555";});
        printMap(mm);


    }

    private void printMap(Map<String,String> mm){
        Iterator<Map.Entry<String, String>> iterator = mm.entrySet().iterator();
        while(iterator.hasNext()){
            Map.Entry<String, String> next = iterator.next();
            System.out.println("key:"+next.getKey()+"  value:"+next.getValue());
        }
    }

輸出:

key:key1  value:val1
key:key2  value:val2
key:key5  value:val5
key:key3  value:val3
key:key4  value:val4
key:key22  value:val22
key:key11  value:val11
key:key112  value:val112
key:key111  value:null

key:key1  value:test1
key:key2  value:val2
key:key4  value:Test3
key:key555  value:val555
key:key22  value:val22
key:key11  value:val11
key:key112  value:val112
key:key111  value:null