递归(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 需要 此处省略
}
处理代码
@Overridepublic 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);}}}