欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java構建菜單樹的實現(xiàn)示例

 更新時間:2023年05月25日 11:20:54   作者:饕餮者也  
本文主要介紹了Java構建菜單樹的實現(xiàn)示例,像一級菜單,二級菜單,三級菜單甚至更多層級的菜單,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在后臺系統(tǒng)中,菜單欄有著嚴格的層次結構,它是系統(tǒng)方便與否的重要功能,像一級菜單,二級菜單,三級菜單甚至更多層級的菜單,我們將它稱為菜單樹,菜單樹往往需要后端程序員來構建好了之后再給前端程序員,前端程序員再去渲染到頁面上這樣一個流程,而且菜單列表是動態(tài)變化的。

那么該如何構建一個菜單樹呢?

在數(shù)據(jù)庫中,menu 表最常見的字段

id(主鍵)
parent_id(父級ID)
menu_name(菜單名稱)
path(路徑)
...(等等)

思路

  • 我們可以把菜單列表返回,獲取parent_id字段等于0的節(jié)點,稱為根節(jié)點,這樣的節(jié)點代表一級菜單
  • 再通過根節(jié)點的主鍵去尋找子菜單,因為要有多及菜單,所以要用遞歸構建子樹,直到沒有子菜單為止
  • 最后通過構建完整的菜單樹

menu 實體類

public class Menu { ?
? ? private Long id; ?
? ? private Long parentId; ?
? ? private String name; ?
? ? private List<Menu> childrenList; ?
? ? public Menu(Long id, Long parentId, String name) { ?
? ? ? ? this.id = id; ?
? ? ? ? this.parentId = parentId; ?
? ? ? ? this.name = name; ?
? ? } ?
? ? // getter setter...
}

構建菜單樹分為以下幾個步驟

返回菜單的根節(jié)點

private List<Menu> getRootNode() { ?
? ? List<Menu> rootNode = new ArrayList<>(); ?
? ? menuList.forEach(item -> { ?
? ? ? ? if (item.getParentId() == 0) { ?
? ? ? ? ? ? rootNode.add(item); ?
? ? ? ? } ?
? ? }); ?
? ? return rootNode; ?
}

構建子菜單樹

private Menu builderChildrenNode(Menu rootNode) { ?
? ? List<Menu> childrenList = new ArrayList<>(); ?
? ? menuList.forEach(item -> { ?
? ? ? ? if (Objects.equals(item.getParentId(), rootNode.getId())) { ?
? ? ? ? // 還需要遍歷三級菜單以后的 ?
? ? ? ? Menu menu = builderChildrenNode(item); ?
? ? ? ? childrenList.add(menu); ?
? ? ? ? } ?
? ? }); ?
? ? rootNode.setChildrenList(childrenList); ?
? ? return rootNode; ?
}

構建菜單樹

public List<Menu> buildTree() { ?
? ? List<Menu> menus = getRootNode(); ?
? ? menus.forEach(this::builderChildrenNode); ?
? ? return menus; ?
}

完整代碼

public class MenuTree { ?
? ? private final List<Menu> menuList; ?
? ? public MenuTree(List<Menu> menuList) { ?
? ? ? ? this.menuList = menuList; ?
? ? } ?
? ? /** ?
? ? * 獲取根結點 ?
? ? * ?
? ? * @return ?
? ? */ ?
? ? private List<Menu> getRootNode() { ?
? ? ? ? List<Menu> rootNode = new ArrayList<>(); ?
? ? ? ? menuList.forEach(item -> { ?
? ? ? ? ? ? if (item.getParentId() == 0) { ?
? ? ? ? ? ? ? ? rootNode.add(item); ?
? ? ? ? ? ? } ?
? ? ? ? }); ?
? ? ? ? return rootNode; ?
? ? } ?
? ? /** ?
? ? * 構建子樹 ?
? ? * ?
? ? * @param rootNode ?
? ? * @return ?
? ? */ ?
? ? private Menu builderChildrenNode(Menu rootNode) { ?
? ? ? ? List<Menu> childrenList = new ArrayList<>(); ?
? ? ? ? menuList.forEach(item -> { ?
? ? ? ? ? ? if (Objects.equals(item.getParentId(), rootNode.getId())) { ?
? ? ? ? ? ? // 還需要遍歷三級菜單以后的 ?
? ? ? ? ? ? Menu menu = builderChildrenNode(item); ?
? ? ? ? ? ? childrenList.add(menu); ?
? ? ? ? ? ? } ?
? ? ? ? }); ?
? ? ? ? rootNode.setChildrenList(childrenList); ?
? ? ? ? return rootNode; ?
? ? } ?
? ? /** ?
? ? * 構建樹 ?
? ? * ?
? ? * @return ?
? ? */ ?
? ? public List<Menu> buildTree() { ?
? ? ? ? List<Menu> menus = getRootNode(); ?
? ? ? ? menus.forEach(this::builderChildrenNode); ?
? ? ? ? return menus; ?
? ? } ?
}

測試

用到了fastjson2依賴

<dependency>  
    <groupId>com.alibaba.fastjson2</groupId>  
    <artifactId>fastjson2</artifactId>  
    <version>2.0.28</version>  
</dependency>
public class MenuTreeTest { ?
? ? public static void main(String[] args) { ?
? ? ? ? List<Menu> menuList = new ArrayList<>(); ?
? ? ? ? menuList.add(new Menu(1L, 0L, "一級菜單1")); ?
? ? ? ? menuList.add(new Menu(2L, 0L, "一級菜單2")); ?
? ? ? ? menuList.add(new Menu(3L, 0L, "一級菜單3")); ?
? ? ? ? menuList.add(new Menu(4L, 1L, "二級菜單1")); ?
? ? ? ? menuList.add(new Menu(5L, 1L, "二級菜單2")); ?
? ? ? ? menuList.add(new Menu(6L, 4L, "三級菜單")); ?
? ? ? ? menuList.add(new Menu(7L, 6L, "四級菜單")); ?
? ? ? ? MenuTree menuTree = new MenuTree(menuList); ?
? ? ? ? List<Menu> menus = menuTree.buildTree(); ?
? ? ? ? String jsonString = JSON.toJSONString(menus); ?
? ? ? ? System.out.println(jsonString); ?
? ? } ?
}

結果

[{
    "childrenList": [{
        "childrenList": [{
            "childrenList": [{
                "childrenList": [],
                "id": 7,
                "name": "四級菜單",
                "parentId": 6
            }],
            "id": 6,
            "name": "三級菜單",
            "parentId": 4
        }],
        "id": 4,
        "name": "二級菜單1",
        "parentId": 1
    }, {
        "childrenList": [],
        "id": 5,
        "name": "二級菜單2",
        "parentId": 1
    }],
    "id": 1,
    "name": "一級菜單1",
    "parentId": 0
}, {
    "childrenList": [],
    "id": 2,
    "name": "一級菜單2",
    "parentId": 0
}, {
    "childrenList": [],
    "id": 3,
    "name": "一級菜單3",
    "parentId": 0
}]

到此這篇關于Java構建菜單樹的實現(xiàn)示例的文章就介紹到這了,更多相關Java構建菜單樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論