业务上第一次使用递归

前言:

根据业务需求,我曾写过一个通过部门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;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanxiaozhang2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值