现有如下数据,需要统计各个学生的总分数。
传统做法是现在new Map()
循环list判断key是否存在,不存在就存入值,存在就取出值累加后再存入。
使用merge()
可以只需要一行代码搞定!!!
List<StuScore> stuScoreList = Arrays.asList(
new StuScore("张三", "数学", 80),
new StuScore("张三", "语文", 90),
new StuScore("张三", "英语", 90),
new StuScore("李四", "数学", 70),
new StuScore("李四", "语文", 80),
new StuScore("李四", "英语", 70)
);
完成测试代码如下
public class MyTest {
@Test
public void test(){
List<StuScore> stuScoreList = Arrays.asList(
new StuScore("张三", "数学", 80),
new StuScore("张三", "语文", 90),
new StuScore("张三", "英语", 90),
new StuScore("李四", "数学", 70),
new StuScore("李四", "语文", 80),
new StuScore("李四", "英语", 70)
);
Map<String, Integer> map = useNormal(stuScoreList);
System.out.println(map);
Map<String, Integer> map1 = useMerge(stuScoreList);
System.out.println(map1);
}
// 传统方法
public static Map<String,Integer> useNormal(List<StuScore> stuScoreList){
Map<String, Integer> map = new HashMap<>();
for (StuScore stuScore : stuScoreList) {
if (map.containsKey(stuScore.getName())){
map.put(stuScore.getName(),map.get(stuScore.getName())+stuScore.getScore());
}else {
map.put(stuScore.getName(),stuScore.getScore());
}
}
return map;
}
// 使用Map提供的Merge方法
// merge方法会先判断map中key是否存在
// 如果不存在则通过设置的key,value 存入map中
// 如果存在则执行下面的回调函数
public static Map<String,Integer> useMerge(List<StuScore> stuScoreList){
Map<String, Integer> map = new HashMap<>();
stuScoreList.forEach(stuScore -> map.merge(stuScore.getName(), stuScore.getScore(), Integer::sum));
return map;
}
}
merge()方法最后的一个参数的回调函数说明。
/**
* t-oldValue 原来map中的值
* v-value 新传入的值
* return 返回的值会被当做新的值存入map中
*/
R apply(T t, U u);