codereview集锦
//查询学生基础信息的listList<StudentVO> list = studentService.getList(request);
//封装学生的其他信息
buildCallCount(list);
private void buildCallCount(List<StudentVO> list) { if (CollectionUtils.isEmpty(list)) {
return;
}
//获取学生用户id的集合
List<Long> stuUserIds = list.stream().map(StudentListVO::getStudentUserId).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(stuUserIds)) {
return;
}
//通过学生用户id集合批量获取学生的其他信息
List<StudentCallCountDto> callCountDtoList = callCountService.findByStuUserIds(stuUserIds);
if (CollectionUtils.isEmpty(callCountDtoList)) {
return;
}
//将获取到的学生信息,封装为map,key为学生用户id
Map<Long, StudentCallCountDto> studentCallCountMap = callCountDtoList.stream()
.filter(studentCallCountDto -> null != studentCallCountDto.getStudentUserId())
.collect(Collectors.toMap(StudentCallCountDto::getStudentUserId, Function.identity(), (v1, v2) -> v1, HashMap::new));
//遍历基础信息的list,对每一条数据进行封装
list.forEach(studentVO -> {
if (studentCallCountMap.containsKey(studentVO.getStudentUserId())) {
StudentCallCountDto studentCallCountDto = studentCallCountMap.get(studentVO.getStudentUserId());
studentVO.setConnectedCount(studentCallCountDto.getConnectCount());
studentVO.setAllConnectCount(studentCallCountDto.getTotalCount());
}
});
}
2.数据封装过多时,采用异步线程
对于第一个问题,如果一个基础列表查出来,需要封装的数据过多时,可以采用异步线程来处理封装过程。对于使用到线程池的地方,就需要注意线程池核心参数的配置。关于线程池的参数含义可以参考:线程池参数含义,关于异步线程的使用可以参考:@Async如何使用
本来想写个伪代码的,但是很难抽象出来。说下思路即可,使用异步线程进行数据的获取,在最后组装数据的时候,需要知道异步线程获取数据是否完成,此处可以使用CountDownLatch来保证线程是否处理完,或者采用Future也可。不论使用CountDownLatch或者future,都要注意对于异常的考虑。即等待多久就算线程没处理完成,也放弃。
后面继续补充。。。。
以上是 codereview集锦 的全部内容, 来源链接: utcz.com/z/516601.html