递归(recursion):程序调用自身的编程技巧。
递归满足2个
条件:
1. 有反复执行的过程(调用自身)
2. 有跳出反复执行过程的条件(递归出口)
项目中用到递归案例
- 递归读取文件
- 获取字典值(带层级关系)
- 获取权限菜单(带层级关系)
示例 :获取权限菜单
菜单表结构
对应实体
public class Menus {
@ApiModelProperty("菜单id 对应表的id")
private String menuId;
@ApiModelProperty("菜单名称 对应表的name")
private String menuName;
@ApiModelProperty("父id 对应表的parent_id")
private String parentId;
@ApiModelProperty("url 对应表的url")
private String parentId;
@ApiModelProperty("子菜单")
private List<Menus> subMenu= Lists.newArrayList();
//get set 需要 此处省略
}
处理代码
@Override
public List<Menus> getAllMenus() {
//获取所有的菜单
List<Menus> list=userMapper.getAllMenus();
List<Menus> menus=new ArrayList<>();
for(Menus m:list){
//找出父级别(最高层级)
if("0".equals(m.getParentId())){
//递归获取子集
getChild(m,list);
menus.add(m);
}
}
return menus;
}
/*递归对子集处理*/
private void getChild(Menus dictDTO, List<Menus> list) {
List<Menus> children = dictDTO.getSubMenu();
for (Menus dto : list) {//获取子集
if (dto.getParentId().equals(dictDTO.getMenuId())) {
children.add(dto);
}
}
//if 判断即是递归出口
if (!CollectionUtils.isEmpty(children)) {
//获取子集的子集
for (Menus child : children) {
getChild(child, list);
}
}
}