递归定义:重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。递归算法简单来说就是自己调用自己。递归要有结束条件,不能死循环。
使用递归树状菜单,核心代码在service层完成
// 层级获取菜单
public List<MenuEntity> hierarchicalAccessMenu(String roleId){
// 获取该角色下所有菜单
List<MenuEntity> menuList = menuDao.getMenuListByRole(roleId);
// 找到所有的1级菜单
List<MenuEntity> mList = new ArrayList<>();
for (int i = 0; i < menuList.size(); i++) {
if (menuList.get(i).getParentId()==0){
mList.add(menuList.get(i));
}
}
// 为一级菜单设置子菜单准备递归
for (MenuEntity menu:mList) {
// 获取父菜单下所有子菜单调用getChildList
List<MenuEntity> childList = getChildList(String.valueOf(menu.getMenuId()),menuList);
menu.setChildList(childList);
}
return mList;
}
public List<MenuEntity> getChildList(String id,List<MenuEntity> menuList){
// 构建子菜单
List<MenuEntity> childList = new ArrayList<>();
// 遍历传入的list
for (MenuEntity menu:menuList) {
// 所有菜单的父id与传入的根节点id比较,若相等则为该级菜单的子菜单
if (String.valueOf(menu.getParentId()).equals(id)){
childList.add(menu);
}
}
// 递归
for (MenuEntity m:childList) {
m.setChildList(getChildList(String.valueOf(m.getMenuId()),menuList));
}
if (childList.size() == 0){
return null;
}
return childList;
}