merge简介
merge() 可以这么理解:它将新的值赋值到 key (如果不存在)或更新给定的key 值对应的 value
1、merge源码
merge() 可以这么理解:它将新的值赋值到 key (如果不存在)或更新给定的key 值对应的 value
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
//判断value和remappingFunction都不为空
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
//通过key去获取旧值 若无这个key则null
V oldValue = get(key);
//新值 = 旧值为null则新值=null,旧值不为null则新值= remappingFunction.apply(旧值, 新值);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
//判断新值为null的话
if(newValue == null) {
//移除这个key
remove(key);
} else {
//不为null的话,重新put
put(key, newValue);
}
return newValue;
}
我们可以看到原理也是很简单的,该方法接收三个参数,一个 key 值,一个 value,一个 remappingFunction ,如果给定的key不存在,它就变成了 put(key, value) 。
但是,如果 key 已经存在一些值,我们 remappingFunction 可以选择合并的方式,然后将合并得到的 newValue 赋值给原先的 key。
2、merge使用
假设有一段业务逻辑,有个学生类,包含学生的姓名、科目、成绩三个属性,需要查看学生的总成绩
pubilc class Student{
private String name;
private String suject;
private Integer score;
public Student(String name, String suject, Integer score) {
this.name = name;
this.suject = suject;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSuject() {
return suject;
}
public void setSuject(String suject) {
this.suject = suject;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}
我们来写一个方法定义学生
public class Demo {
public static ArrayList<Student> reStrudents(){
ArrayList<Student> students = new ArrayList();
Student student1 = new Student("王麻子", "数学", 29);
Student student2 = new Student("黑蛋", "数学", 43);
Student student3 = new Student("大全", "数学", 56);
Student student4 = new Student("二雷子", "数学", 22);
Student student5 = new Student("王麻子", "语文", 76);
Student student6 = new Student("黑蛋", "语文", 54);
Student student7 = new Student("大全", "语文", 56);
Student student8 = new Student("二雷子", "语文", 67);
Student student9 = new Student("王麻子", "英语", 102);
Student student10 = new Student("黑蛋", "英语", 23);
Student student11 = new Student("大全", "英语", 43);
Student student12 = new Student("二雷子", "英语", 23);
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
students.add(student5);
students.add(student6);
students.add(student7);
students.add(student8);
students.add(student9);
students.add(student10);
students.add(student11);
students.add(student12);
return students;
}
}
我们来写业务逻辑
非使用merger方法
public static void main(String[] args) {
ArrayList<Student> students = reStrudents();
HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
students.forEach(student -> {
if (stringIntegerHashMap.containsKey(student.getName())){
stringIntegerHashMap.put(student.getName(),
stringIntegerHashMap.get(student.getName())+student.getScore());
}else {
stringIntegerHashMap.put(student.getName(),student.getScore());
}});
System.out.println(stringIntegerHashMap.toString());
}
使用merge方法
public static void main(String[] args) {
ArrayList<Student> students = reStrudents();
HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
students.forEach(student ->
stringIntegerHashMap.merge(
student.getName(),
student.getScore(),
Integer::sum
));
System.out.println(stringIntegerHashMap.toString());
}
使用场景
这个使用场景相对来说还是比较多的,比如分组求和这类的操作,虽然 stream 中有相关 groupingBy() 方法,但如果你想在循环中做一些其他操作的时候,merge() 还是一个挺不错的选择的。