需求:避免for循环里面查数据库
未优化前的代码:for循环里面再去查一遍数据,要是appTasks数据量几百上千个,就要相当于查了几百上千次数据库,查询就会很慢。
appTasks.stream().forEach(item -> {
List<AppTaskRel> taskRels = appTaskRelService.findByTaskId(item.getId());
item.setAppTaskRels(taskRels);
});
优化后的代码,就是比较费cpu,有利有弊吧,比起迭代查数据库,还是好很多。
//appTasks里面过滤出taskId集合
List<Integer> taskIds = appTasks.stream().map(AppTask::getiId).collect(Collectors.toList());
//根据过滤出的id查询出所有关联的taskRels
List<AppTaskRel> taskRels = appTaskRelService.findByTaskIds(taskIds);
//再转换称map,taskId作为key,AppTaskRel集合作为value
Map<Integer, List<AppTaskRel>> taskRelMap = taskRels.stream().collect(Collectors.groupingBy(AppTaskRel::getTaskId));
//根据map.get(key)获取某一个taskId关联的AppTaskRel
appTasks.stream().forEach(e -> {
e.setAppTaskRels(taskRelMap.get(e.getiId()));
});