code review集锦

1.查过3个表的join,改用java进行数据组装

我们经常会遇到前端查询列表,但是列表的数据存在于多个表中。一般少于三个表的话,我们就会使用jion语句来处理。但是超过3个表的话,用jion显然不是好办法。通常就会采用java来处理。
伪代码如下:

//查询学生基础信息的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,都要注意对于异常的考虑。即等待多久就算线程没处理完成,也放弃。

后面继续补充。。。。

你可能感兴趣的:(java基础,java)