使用递归做三级菜单 Java SpringBoot
实体类
@Data
public class SysMenu implements Serializable {
private Long id;
private Long parentId;
private String name;
private Integer type;
private String path;
private String component;
private String perms;
private String icon;
private Integer sortValue;
private Integer status;
// 下级列表
private List<SysMenu> children;
// 是否选中
private boolean isSelect;
}
代码实现
在遍历过程中,通过判断 sysMenu 的 parentId 是否为 0,来确定是否为根节点。如果是根节点,则调用 getChildren 方法来构建子节点,并将根节点添加到 trees 列表中。
getChildren 方法用于构建子节点。首先将当前 sysMenu 的 children 属性设置为一个空的 ArrayList 对象。然后遍历 sysMenuList 中的每个 menu 对象。
在遍历过程中,首先判断 menu 的 children 是否为 null,如果是,则将其设置为一个空的 ArrayList 对象。然后判断当前 menu 的 parentId 是否与 sysMenu 的 id 相同,如果相同,则将 menu 添加到 sysMenu 的 children 中,并递归调用 getChildren 方法来构建 menu 的子节点。
最终,getChildren 方法返回构建好的 sysMenu 对象。
/**
* * 使用递归方法:
* 1. 找到入口
* 2. 找到出口条件
*/
public class MenuHelper {
/**
* 构建树型结构
*
* @param sysMenuList 初始列表
* @return 返回树型结构
*/
public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
ArrayList<SysMenu> trees = new ArrayList<>();
// 把菜单进行遍历
sysMenuList.forEach(sysMenu -> {
// 设置入口条件
if (sysMenu.getParentId() == 0) {
trees.add(getChildren(sysMenu, sysMenuList));
}
});
return trees;
}
/**
* 构建子节点
*
* @param sysMenu 当前
* @param sysMenuList 初始解雇
* @return 构建的子节点
*/
public static SysMenu getChildren(SysMenu sysMenu, List<SysMenu> sysMenuList) {
// 设置子节点为空数组
sysMenu.setChildren(new ArrayList<>());
sysMenuList.forEach(menu -> {
// 当子节点为 空设置为空数组
if (menu.getChildren() == null) {
menu.setChildren(new ArrayList<>());
}
// 当前id与父级id相同添加当前元素
if (sysMenu.getId().equals(menu.getParentId())) {
sysMenu.getChildren().add(getChildren(menu, sysMenuList));
}
});
return sysMenu;
}
}