使用递归做三级菜单 Java SpringBoot

使用递归做三级菜单 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;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用Java实现递归三级菜单的示例代码: ```java // 获取树状的菜单结构 @Override public List<Menu> findTreeMenu() { List<Menu> menus = findAllMenu(); List<Menu> rootMenus = new ArrayList<>(); // 从最上级菜单开始展示 for (Menu menu : menus) { if (menu.getPid().equals(0L)) { rootMenus.add(menu); } } for (Menu rootMenu : rootMenus) { // 获取最上级菜单的子菜单,子菜单的子菜单也会获取到 List<Menu> child = getChild(rootMenu.getId(), menus); rootMenu.setSubMenu(child); } return rootMenus; } // 获取子菜单方法 private List<Menu> getChild(Long id, List<Menu> menus) { List<Menu> childList = new ArrayList<>(); for (Menu menu : menus) { if (menu.getPid().equals(id)) { childList.add(menu); } } for (Menu menu : childList) { List<Menu> child = getChild(menu.getId(), menus); menu.setSubMenu(child); } if (childList.size() == 0) { return null; } return childList; } // 实体类设计 import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; @Data @TableName("t_menu") @JsonInclude(JsonInclude.Include.NON_NULL) public class Menu { private Long id; private String menuname; private Long pid; private String url; @TableField(exist = false) private List<Menu> subMenu; } ``` 这段代码实现了一个递归三级菜单结构。首先,通过`findTreeMenu()`方法获取根菜单列表。然后,通过`getChild()`方法递归获取每个菜单的子菜单,直到没有子菜单为止。最后,将子菜单列表赋值给每个菜单的`subMenu`属性。实体类`Menu`定义了菜单的属性,包括菜单ID、菜单名称、父菜单ID、URL和子菜单列表。 #### 引用[.reference_title] - *1* *2* *3* [java实现三级菜单展示(递归)](https://blog.csdn.net/WoAiXiaoMingMing/article/details/121518156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值