default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
V oldValue = get(key);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
if(newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
刚开始自己碰见这个没看源码直接百度,没看到很清晰的例子,就自己写个博客吧。
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。 否则,将关联值替换为给定重映射函数的结果,如果结果为null
,则将其null
。 当组合键的多个映射值时,该方法可能是有用的
public class KettleTest {
private Integer id;
private String msg;
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"lll");
KettleTest kettleTest = new KettleTest();
kettleTest.setId(1);
kettleTest.setMsg("hhhhh");
KettleTest kettleTest2 = new KettleTest();
kettleTest2.setId(2);
kettleTest2.setMsg("yyyyy");
System.out.println(map.toString());
//也就是源码的V newValue = (oldValue == null) ? value : remappingFunction.apply(oldValue,value);
//当存在相同的id则将value赋值为后面函数执行后的值,否则直接赋值为value
//map里面的id有kettleTest.getId(),这个时候我们将会保存“lll”+“,”+kettleTest.getMsg()
//在这里p2是kettleTest.getMsg(),p1是“lll”,就是map.get(kettleTest.getId())
map.merge(kettleTest.getId(),kettleTest.getMsg(),(p1, p2) -> p1 + "," + p2);
System.out.println(map.toString());
//map里面不存在id为kettleTest.getId(),我们进行保存操作即可
map.merge(kettleTest2.getId(),kettleTest2.getMsg(),(p1, p2) -> p1 + "," + p2);
System.out.println(map.toString());
}
}