最近一个多月在分析SpringBoot源码(面试官:你说说Springboot的启动过程吧(5万字分析启动过程))大概写了5万字,感兴趣的可以看一下哦~
在源码分析的博客中搜索3)为生命周期处理器进行广播更新,这个小节中,有一个关于Map的操作方法:computeIfAbsent,这个方法我以前的确是没有用过,看了一些别的大神写的demo和自己的理解,也写了一下:
package com.fanhf.demo;
import org.testng.annotations.Test;
import java.util.*;
public class SpringBootExercize {
@Test
public void testComputeIfAbsent(){
HashMap<String, PersonGroup> personGroupHashMap = new HashMap<>();
PersonGroup person1 = new PersonGroup();
person1.add("张三");
personGroupHashMap.put("Doctor", person1);
System.out.println("--------------原Map集合元素-----------------");
personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
System.out.println("--------------Map中添加元素--常规做法-----------------");
// Map集合中包含Teacher的分组,则往Teacher的分组添加王五
if (personGroupHashMap.containsKey("Teacher")) {
personGroupHashMap.get("Teacher").add("王五");
} else {
// Map集合中不包含Teacher的分组,则往Teacher的分组添加赵六
PersonGroup person3 = new PersonGroup();
person3.add("赵六");
personGroupHashMap.put("Teacher", person3);
}
personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
System.out.println("-----------Map中添加元素--1.8升级做法-----putIfAbsent---------------");
// key存在则不覆盖
personGroupHashMap.putIfAbsent("Teacher", new PersonGroup());
PersonGroup personGroup = new PersonGroup();
personGroup.add("Lily");
//key不存在才放到map中
personGroupHashMap.putIfAbsent("Developer", personGroup);
personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
System.out.println("-----------Map中添加元素--1.8升级做法----computeIfAbsent------------");
//Map集合中不包含Doctor的分组,则往Doctor的分组添加周七
personGroupHashMap.computeIfAbsent("Doctor", pg -> new PersonGroup()).add("周七");
//Map集合中包含Teacher的分组,则往Teacher的分组添加王五
personGroupHashMap.computeIfAbsent("Teacher", pg -> new PersonGroup()).add("王五");
personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
System.out.println("-----------Map中添加元素--1.8升级做法--computeIfPresent-------------");
//存在Teacher,则替换掉原来的,所以我感觉这个的使用场景比较少,还是computeIfAbsent的使用场景多些。
personGroupHashMap.computeIfPresent("Teacher", (k, pg) -> new PersonGroup()).add("只对存在的key对应的value进行替换操作,不存在的key的有NPE的风险");
personGroupHashMap.forEach((k, v) -> System.out.println(k + "->" + v.members));
}
/**
* 把人进行分组
*/
private class PersonGroup {
private List<String> members = new ArrayList<>();
public void add(String name) {
this.members.add(name);
}
}
}
控制台打印:
-------------你知道的越多,不知道的越多--------------