Java 后端封装自关联菜单表数据

封装菜单表递归方法 diGuiMenu(),自关联表数据

话不多说,上代码

 

复制代码
   /**
     * 封装菜单集合
     * @param rootMenu 角色对应所有菜单
     * @return
     */
    private List<Menu> diGuiMenu(List<Menu> rootMenu) {
//        Map<Integer, List<Menu>> groupByParentMap = menuList.stream().collect(Collectors.groupingBy(Menu::getParentId));
////rootMenu所有菜单的集合
        List<Menu> menuList = new ArrayList<Menu>();
// 先找到所有的一级菜单
        for (int i = 0; i < rootMenu.size(); i++) {
// 一级菜单没有parentId
            if (StringUtils.isEmpty(rootMenu.get(i).getParentId())) {
                menuList.add(rootMenu.get(i));
            }
        }
// 为一级菜单设置子菜单,getChild是递归调用的
        for (Menu menu : menuList) {
            List<Menu> childs = getChild(menu.getId().toString(), rootMenu);
            if (childs != null && childs.size() > 0) {
                menu.setList(childs);
            }
        }
        return menuList;
    }
    private List<Menu> getChild(String id, List<Menu> rootMenu) {
// 子菜单
        List<Menu> childList = new ArrayList<Menu>();
        for (Menu menu : rootMenu) {
// 遍历所有节点,将父菜单id与传过来的id比较
            if (!StringUtils.isEmpty(menu.getParentId().toString())) {
                if ((menu.getParentId() + "").equals(id)) {
                    childList.add(menu);
                }
            }
        }
// 把子菜单的子菜单再循环一遍
        for (Menu menu : childList) {// 没有url子菜单还有子菜单
            if (!StringUtils.isEmpty(menu.getParentId().toString())) {
// 递归
                List<Menu> childs = getChild(menu.getId().toString(), rootMenu);
                if (childs != null && childs.size() > 0) {
                    menu.setList(childs);
                }
            }
        } // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
复制代码

 

参考链接 ——http://www.yayihouse.com/yayishuwu/chapter/1823

本文作者:好Wu赖

本文链接:https://www.cnblogs.com/erlongxizhu-03/p/12367895.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   好Wu赖  阅读(720)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起