JDK 8の新しい特性(3)Mapの深い使用putIfAbsent、computeIfAbsent、computeIfPresentの深い使用

3082 ワード

Java 8のdefaultメソッドの特性のおかげで、Java 8はMapに対して多くの実用的なデフォルトメソッドを追加しました.
putIfAbsentの方法は簡単です       従来のputメソッドではkeyが存在する限りvalue値が上書きされますが、putメソッドはput以前の値を返し、put以前の値がなければnullを返します.       PutIfAbsentメソッドは、keyが存在しない場合、またはkeyがnullの場合にのみ、value値が上書きされます.   ソースコードは次のとおりです.
    default V putIfAbsent(K key, V value) {
        V v = get(key);
        if (v == null) {
            v = put(key, value);
        }

        return v;
    }
 map.putIfAbsent("t1", "aa");の等価コードは次のとおりです.
if(map.containsKey("t1")&&map.get("t1")!=null) {
	map.put("t1", "aa");
}
シーンの使用:キーの値を変更する場合は、キーが存在するかどうか分からない場合であり、キーを追加したくない場合に使用します. 
computeIfAbsentメソッドはputIfAbsentと似ていますが、戻り値が異なり、value値が存在しない場合は、新しいvalue値を返し、いくつかの条件をカスタマイズしてフィルタリングすることができます. 
	List list = Arrays.asList(
			new People("  ",2),
			new People("   ",15),
			new People("  ",8),
			new People("  ",10),
			new People("  ",8),
			new People("   ",2));
	public void testcomputeIfAbsent () {
   	 	//        map
        Map> resultMap = new HashMap>();
        //            
        for (People people : list) {
        	//putIfAbsent  ,   key     key null   ,value        ,
            List s = resultMap.putIfAbsent(people.getAge(), new ArrayList());
            if(s==null) {//  value    ,    null,      
            	s = resultMap.putIfAbsent(people.getAge(), new ArrayList());
            }
            s.add(people);
        }
        System.out.println(resultMap);
        resultMap = new HashMap>();
        // 5         
        for (People people : list) {
        	//  value    ,      value 
            List s = resultMap.computeIfAbsent(people.getAge(), k ->{
            	if(k>5) {
            		return new ArrayList();
            	}
            	return null;
            });
            if(s!=null) {
            	s.add(people);
            }
        }
        System.out.println(resultMap);
	}
computeIfPresentメソッドとcomputeIfAbsentメソッドは正反対で、keyが存在する場合にのみ操作を実行するので、上記のニーズを変更して5歳以上の人をグループ化し、8歳の人に対して年齢加算1操作を行います.
        // 5         ,       8      1
        resultMap = new HashMap>();
        for (People people : list) {
        	 List s = resultMap.computeIfAbsent(people.getAge(), k ->{
             	if(k>5) {
             		return new ArrayList();
             	}
             	return null;
             });
             if(s!=null) {
             	s.add(people);
             }
		}
        //  value    ,      value 
        resultMap.computeIfPresent(8, (k,v)->{
    	    for(People people:v) {
    	    	people.setAge(people.getAge()+1);
    	    }
       		return v;
        });
        System.out.println(resultMap);