java代码递归(多级菜单递归遍历成树)

转载地址:https://blog.csdn.net/qq_36421955/article/details/80846044?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4

1.菜单类:

 1 public class Menu {
 2     // 菜单id
 3     private String id;
 4     // 菜单名称
 5     private String name;
 6     // 父菜单id
 7     private String parentId;
 8     // 菜单url
 9     private String url;
10     // 菜单图标
11     private String icon;
12     // 菜单顺序
13     private int order;
14     // 子菜单
15     private List<Menu> childMenus;
16     // ... 省去getter和setter方法以及toString方法
17 
18 }

2.递归主题方法:

 1 /**
 2      * 模块名称
 3      */
 4     public Map<String,Object> testQueryMenuList() {
 5         // 原始的数据
 6        List<Menu> rootMenu = menuDao.queryMenuList(null);
 7         // 查看结果
 8        for (Menu menu : rootMenu) {
 9            System.out.println(menu);
10        }
11         // 最后的结果
12        List<Menu> menuList = new ArrayList<Menu>();
13         // 先找到所有的一级菜单
14        for (int i = 0; i < rootMenu.size(); i++) {
15             // 一级菜单没有parentId
16            if (StringUtils.isBlank(rootMenu.get(i).getParentId())) {
17                menuList.add(rootMenu.get(i));
18            }
19        }
20         // 为一级菜单设置子菜单,getChild是递归调用的
21        for (Menu menu : menuList) {
22            menu.setChildMenus(getChild(menu.getId(), rootMenu));
23        }
24        Map<String, Object> jsonMap = new HashMap<>();
25        jsonMap.put("menu", menuList);
26        //System.out.println(gson.toJson(jsonMap));//使用gson需要在pom.xml引入gson依赖见 2.1步骤
27        //return gson.toJson(jsonMap);//返回类型为String
28         return  jsonMap;
29     }
30 
31     /**
32      * 子方法
33      **/
34     private List<Menu> getChild(String id, List<Menu> rootMenu) {
35         // 子菜单
36        List<Menu> childList = new ArrayList<>();
37        for (Menu menu : rootMenu) {
38             // 遍历所有节点,将父菜单id与传过来的id比较
39            if (StringUtils.isNotBlank(menu.getParentId())) {
40                if (menu.getParentId().equals(id)) {
41                    childList.add(menu);
42                }
43            }
44        }
45         // 把子菜单的子菜单再循环一遍
46        for (Menu menu : childList) {// 没有url子菜单还有子菜单
47     //该节点不含子节点 具体见2.2解释
48             if (StringUtils.isBlank(menu.getUrl())) {
49                 // 递归
50                menu.setChildMenus(getChild(menu.getId(), rootMenu));
51            }
52        } // 递归退出条件
53        if (childList.size() == 0) {
54            return null;
55        }
56        return childList;
57     }
58     

 2.1.引入依赖pom.xml

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.8</version>
</dependency>

2.2  StringUtils.isBlank(menu.getUrl())

这里根据需求可做改动,我这里如果一个菜单有子菜单的话该菜单是没有url的,子菜单才有具体的url跳转,父菜单不用绑定url点击后只展示子菜单并不进行请求接口,
所以没有url的菜单肯定是有子菜单的,有了url的菜单肯定是最终级别分支的菜单,所以对url进行判空决定是否再去查询子菜单
原文地址:https://www.cnblogs.com/lidar/p/12972792.html