前言:
根据业务需求,我曾写过一个通过部门ID查询所有子部门的接口,当时由于开发时间紧张,使用了最笨的方法,多层嵌套查询子部门,并且只查询了三层。最近代码Review,我把该接口用递归的方式重写了一遍,代码简洁清了不少!下面简单介绍一下:
原代码:
public List<String> listDeptIdByDeptId(String deptId) {
//现在只查三级
List<String> deptIds=new ArrayList<>();
deptIds.add(deptId);
//一级
List<DeptDO> deptDOList = deptMapper.listDeptByParentId(deptId);
if(!deptDOList.isEmpty()){
deptIds.addAll(deptDOList.stream().map(DeptDO::getDeptId).collect(Collectors.toList()));
//二级
deptDOList.stream().forEach(x->{
List<DeptDO> deptDOOne = deptMapper.listDeptByParentId(x.getDeptId());
if(!deptDOOne.isEmpty()){
deptIds.addAll(deptDOOne.stream().map(DeptDO::getDeptId).collect(Collectors.toList()));
//三级
deptDOOne.stream().forEach(d->{
List<DeptDO> deptDOTwo = deptMapper.listDeptByParentId(d.getDeptId());
if(!deptDOTwo.isEmpty()){
deptIds.addAll(deptDOTwo.stream().map(DeptDO::getDeptId).collect(Collectors.toList()));
}
});
}
});
}
return deptIds;
}
递归优化第一版:
public List<String> listDeptIdByDeptId(String deptId) {
//需要的部门
List<String> deptIds=new ArrayList<>();
//封装查询条件
List<DeptDO> deptDOs=new ArrayList<>();
DeptDO deptDO = new DeptDO();
deptDO.setDeptId(deptId);
deptDOs.add(deptDO);
//调用递归方法
listDeptRecursion( deptDOs, deptIds);
return deptIds;
}
/**
* 递归查询
*
* @param deptDOs
* @param deptIds
*/
private void listDeptRecursion(List<DeptDO> deptDOs,List<String> deptIds){
if(!deptDOs.isEmpty()){
deptIds.addAll(deptDOs.stream().map(DeptDO::getDeptId).collect(Collectors.toList()));
deptDOs.forEach(x->{
listDeptRecursion(deptMapper.listDeptByParentId(x.getDeptId()),deptIds);
});
}
return;
}
递归优化第二版(数据层优化,通过部门ID查询只返回部门ID集合):
public List<String> listDeptIdByDeptId(String deptId) {
//需要的部门
List<String> deptIds=new ArrayList<>();
//封装查询条件
List<String> parentIds=new ArrayList<>();
parentIds.add("5d4a620723ed48afa3c249fbc02367fd");
//调用递归方法
listDeptRecursion(parentIds, deptIds);
return deptIds;
}
/**
* 递归查询
*
* @param parentIds
* @param deptIds
*/
private void listDeptRecursion(List<String> parentIds,List<String> deptIds){
if(!parentIds.isEmpty()){
deptIds.addAll(parentIds);
parentIds.forEach(x->{
listDeptRecursion(deptMapper.listDeptIdByParentId(x),deptIds);
});
}
return;
}
递归优化第三版(减少数据库连接,一次性查询所有部门,Java遍历结果):
public List<String> listDeptIdByDeptId(String deptId) {
//所有的部门
List<DeptDO> allDepts=deptMapper.list();
//需要的部门
List<String> deptIds=new ArrayList<>();
//封装查询条件
List<String> parentIds=new ArrayList<>();
parentIds.add("5d4a620723ed48afa3c249fbc02367fd");
//调用递归方法
listDeptRecursion(parentIds, deptIds,allDepts);
return deptIds;
}
/**
* 递归查询
*
* @param parentIds
* @param deptIds
* @param allDepts
*/
private void listDeptRecursion(List<String> parentIds,List<String> deptIds,List<DeptDO> allDepts){
if(!parentIds.isEmpty()){
deptIds.addAll(parentIds);
parentIds.forEach(x->{
listDeptRecursion(allDepts.stream().filter(y -> x.equals(y.getParentId())).map(y->y.getDeptId).collect(Collectors.toList()),deptIds,allDepts);
});
}
return;
}