【Java8】Map骚操作,你都懂了吗

总所周知,Java8最大的特性就说更多的面向函数,比如引入了Lambda等,可以更好的进行函数式编程。

1.merge()
merge()可以这么理解:它将新的值赋值到key(如果不存在)或更新给定的key值对应的value。源码如下:

 default V merge(K key,V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction){
    
    
	Object.requireNonNull(remappingFunction);
	Object.requireNonNull(value);
	V oldValue = this.get(key);
	V newValue = oldValue == null ? value :
	remappingFunction.apply(oldValue,value);
	if(newValue == null){
    
    
		this.remove(key);
	}else{
    
    
		this.put(key,newValue);
	}
	return newValue;
}

原理如下:
该方法接收三个参数:一个key值,一个value值,一个remappingFunction,如果给定的key不存在,它就变成了put(key,value)。但是,如果key已经存在一些值,我们remappingFunction可以选择合并的方式,然后将合并得到的newValue赋值给原先的key。
使用场景:
这个使用场景相对来说还是比较多的,比如分组求和这类的操作,虽然stream中有相关groupingBy()方法,但如果你想在循环中做一些其他操作的时候,merge()还是一个挺不错的选择的的。

2.compute()
compute()可以这么理解:其返回值是计算后得到的新值:

源码如下:

default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction){
    
    
	Objects.requireNonNull(remappingFunction);
	V oldValue = this.get(key);
	V newValue = rrmappingFunction.apply(key,oldValue);
	if(newValue == null){
    
    
		if(oldValue == null && !this.containsKey(key)){
    
    
			return null;
		}else{
    
    
			this.remove(key);
			return null;
		}
	}else{
    
    
		this.put(key,newValue);
		return newValue;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42777004/article/details/108132069