格言:在程序猿界混出點(diǎn)名堂有滑!
JAVA8在map新增了方法merge和computeIfAbsent役拴,直接通過(guò)例子來(lái)看一下如何使用碾盟?
1.merge
需求場(chǎng)景:有一個(gè)學(xué)生的集合货岭,按班級(jí)統(tǒng)計(jì)學(xué)生的成績(jī)總和苍息。
a.老的寫法
public static Map<String, Integer> mergeOld() {
List<Student> students = Lists.newArrayList();
students.add(new Student("張三", "一年級(jí)一班", 70));
students.add(new Student("李四", "一年級(jí)一班", 70));
students.add(new Student("王五", "一年級(jí)二班", 80));
Map<String, Integer> map = new HashMap<String, Integer>();
students.forEach(s -> {
String clazz = s.getClazz();
Integer score = s.getScore();
Integer summary;
if ((summary = map.get(clazz)) != null) {
map.put(clazz, summary + score);
} else {
map.put(clazz, score);
}
});
return map;
}
b.新的寫法
public static Map<String, Integer> mergeNew() {
List<Student> students = Lists.newArrayList();
students.add(new Student("張三", "一年級(jí)一班", 70));
students.add(new Student("李四", "一年級(jí)一班", 70));
students.add(new Student("王五", "一年級(jí)二班", 80));
Map<String, Integer> map = new HashMap<String, Integer>();
students.forEach(s -> map.merge(s.getClazz(), s.getScore(), (ov, nv) -> ov + nv));
return map;
}
merge是對(duì)同一個(gè)key的新value和舊value的一個(gè)合并,合并規(guī)則自己實(shí)現(xiàn)集惋,
該方法第一個(gè)參數(shù)當(dāng)然為key孕似,第二個(gè)參數(shù)是新value,第三個(gè)參數(shù)是計(jì)算規(guī)則刮刑。
如果key對(duì)應(yīng)的舊value為空喉祭,則value是新value,如果key對(duì)應(yīng)的就value不為空雷绢,則value為計(jì)算的value泛烙。
一句話實(shí)現(xiàn)以上邏輯是不是很簡(jiǎn)單。翘紊。
2.computeIfAbsent
需求場(chǎng)景:有一個(gè)學(xué)生的集合蔽氨,按班級(jí)統(tǒng)計(jì)學(xué)生的成績(jī)的分布。
a.老的寫法
public static Map<String, List<Integer>> computeIfAbsentOld() {
List<Student> students = Lists.newArrayList();
students.add(new Student("張三", "一年級(jí)一班", 70));
students.add(new Student("李四", "一年級(jí)一班", 70));
students.add(new Student("王五", "一年級(jí)二班", 80));
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
students.forEach(s -> {
String clazz = s.getClazz();
Integer score = s.getScore();
List<Integer> scores;
if ((scores = map.get(clazz)) == null) {
map.put(clazz, Lists.newArrayList(score));
} else {
scores.add(score);
}
});
return map;
}
b.新的寫法
public static Map<String, List<Integer>> computeIfAbsentNew() {
List<Student> students = Lists.newArrayList();
students.add(new Student("張三", "一年級(jí)一班", 70));
students.add(new Student("李四", "一年級(jí)一班", 70));
students.add(new Student("王五", "一年級(jí)二班", 80));
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
students.forEach(s -> map.computeIfAbsent(s.getClazz(), (k)->Lists.newArrayList()).add(s.getScore()));
return map;
}
computeIfAbsent第一個(gè)參數(shù)為key,第二個(gè)參數(shù)為value
當(dāng)key對(duì)應(yīng)的value為空時(shí)鹉究,才設(shè)置value
關(guān)鍵在于返回值如果key對(duì)應(yīng)的value為空中捆,則返回新put的value,如果key對(duì)應(yīng)的value不為空坊饶,則返回舊value
趕快試試吧泄伪!