codereview集锦

编程

//查询学生基础信息的list

List<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

回到顶部