最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java構(gòu)建菜單樹(shù)的實(shí)現(xiàn)示例

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

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

那么該如何構(gòu)建一個(gè)菜單樹(shù)呢?

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

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

思路

  • 我們可以把菜單列表返回,獲取parent_id字段等于0的節(jié)點(diǎn),稱為根節(jié)點(diǎn),這樣的節(jié)點(diǎn)代表一級(jí)菜單
  • 再通過(guò)根節(jié)點(diǎn)的主鍵去尋找子菜單,因?yàn)橐卸嗉安藛危砸眠f歸構(gòu)建子樹(shù),直到?jīng)]有子菜單為止
  • 最后通過(guò)構(gòu)建完整的菜單樹(shù)

menu 實(shí)體類

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...
}

構(gòu)建菜單樹(shù)分為以下幾個(gè)步驟

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

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

構(gòu)建子菜單樹(shù)

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

構(gòu)建菜單樹(shù)

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; ?
? ? } ?
? ? /** ?
? ? * 獲取根結(jié)點(diǎn) ?
? ? * ?
? ? * @return ?
? ? */ ?
? ? private List<Menu> getRootNode() { ?
? ? ? ? List<Menu> rootNode = new ArrayList<>(); ?
? ? ? ? menuList.forEach(item -> { ?
? ? ? ? ? ? if (item.getParentId() == 0) { ?
? ? ? ? ? ? ? ? rootNode.add(item); ?
? ? ? ? ? ? } ?
? ? ? ? }); ?
? ? ? ? return rootNode; ?
? ? } ?
? ? /** ?
? ? * 構(gòu)建子樹(shù) ?
? ? * ?
? ? * @param rootNode ?
? ? * @return ?
? ? */ ?
? ? private Menu builderChildrenNode(Menu rootNode) { ?
? ? ? ? List<Menu> childrenList = new ArrayList<>(); ?
? ? ? ? menuList.forEach(item -> { ?
? ? ? ? ? ? if (Objects.equals(item.getParentId(), rootNode.getId())) { ?
? ? ? ? ? ? // 還需要遍歷三級(jí)菜單以后的 ?
? ? ? ? ? ? Menu menu = builderChildrenNode(item); ?
? ? ? ? ? ? childrenList.add(menu); ?
? ? ? ? ? ? } ?
? ? ? ? }); ?
? ? ? ? rootNode.setChildrenList(childrenList); ?
? ? ? ? return rootNode; ?
? ? } ?
? ? /** ?
? ? * 構(gòu)建樹(shù) ?
? ? * ?
? ? * @return ?
? ? */ ?
? ? public List<Menu> buildTree() { ?
? ? ? ? List<Menu> menus = getRootNode(); ?
? ? ? ? menus.forEach(this::builderChildrenNode); ?
? ? ? ? return menus; ?
? ? } ?
}

測(cè)試

用到了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, "一級(jí)菜單1")); ?
? ? ? ? menuList.add(new Menu(2L, 0L, "一級(jí)菜單2")); ?
? ? ? ? menuList.add(new Menu(3L, 0L, "一級(jí)菜單3")); ?
? ? ? ? menuList.add(new Menu(4L, 1L, "二級(jí)菜單1")); ?
? ? ? ? menuList.add(new Menu(5L, 1L, "二級(jí)菜單2")); ?
? ? ? ? menuList.add(new Menu(6L, 4L, "三級(jí)菜單")); ?
? ? ? ? menuList.add(new Menu(7L, 6L, "四級(jí)菜單")); ?
? ? ? ? MenuTree menuTree = new MenuTree(menuList); ?
? ? ? ? List<Menu> menus = menuTree.buildTree(); ?
? ? ? ? String jsonString = JSON.toJSONString(menus); ?
? ? ? ? System.out.println(jsonString); ?
? ? } ?
}

結(jié)果

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

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

相關(guān)文章

  • SpringBoot+MyBatis進(jìn)行XML中循環(huán)處理List參數(shù)的終極指南

    SpringBoot+MyBatis進(jìn)行XML中循環(huán)處理List參數(shù)的終極指南

    這篇文章主要為大家詳細(xì)介紹了SpringBoot整合MyBatis進(jìn)行XML中循環(huán)處理List參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-07-07
  • Java?Web開(kāi)發(fā)環(huán)境配置詳解

    Java?Web開(kāi)發(fā)環(huán)境配置詳解

    這篇文章主要介紹了Java?Web開(kāi)發(fā)環(huán)境配置詳解,對(duì)初學(xué)者是個(gè)必備的過(guò)程,有需要的可以了解一下
    2016-11-11
  • java開(kāi)發(fā)中遇到的異常匯總詳解

    java開(kāi)發(fā)中遇到的異常匯總詳解

    這篇文章主要介紹了java開(kāi)發(fā)中遇到的異常匯總詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼

    Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼

    這篇文章主要介紹了Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼,需要的朋友可以參考下
    2017-09-09
  • Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決

    Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決

    這篇文章主要介紹了Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java中常見(jiàn)的幾種四舍五入方法總結(jié)

    Java中常見(jiàn)的幾種四舍五入方法總結(jié)

    在Java編程中四舍五入是一個(gè)常見(jiàn)的數(shù)學(xué)運(yùn)算需求,下面這篇文章主要給大家介紹了關(guān)于Java中常見(jiàn)的幾種四舍五入方法,文章通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-08-08
  • Spring MessageSource獲取消息不符合預(yù)期的問(wèn)題解決方案

    Spring MessageSource獲取消息不符合預(yù)期的問(wèn)題解決方案

    最近我參與的產(chǎn)品要做國(guó)際化支持,選擇了用Spring MessageSource來(lái)實(shí)現(xiàn),這個(gè)Spring 框架提供的工具使用很簡(jiǎn)單,網(wǎng)上有各種教程文章,這里不做贅述,只說(shuō)一個(gè)實(shí)際遇到的問(wèn)題及解決方案,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)的KNN算法示例

    Java實(shí)現(xiàn)的KNN算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的KNN算法,結(jié)合實(shí)例形式分析了KNN算法的原理及Java定義與使用KNN算法流程、訓(xùn)練數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Java的包裝類特性總結(jié)

    Java的包裝類特性總結(jié)

    這篇文章主要介紹Java的包裝類的一些特性,包裝類的作用,哪些類屬于包裝類等,文中有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • java web開(kāi)發(fā)之servlet圖形驗(yàn)證碼功能的實(shí)現(xiàn)

    java web開(kāi)發(fā)之servlet圖形驗(yàn)證碼功能的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了java web開(kāi)發(fā)之servlet中圖形驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

镇原县| 乌拉特中旗| 徐闻县| 土默特左旗| 青河县| 岑巩县| 开平市| 望城县| 炉霍县| 吴川市| 菏泽市| 日土县| 土默特左旗| 嘉荫县| 宣城市| 墨玉县| 囊谦县| 牟定县| 拉萨市| 阳东县| 新安县| 获嘉县| 南木林县| 新沂市| 西峡县| 吉林省| 白朗县| 梨树县| 自治县| 内乡县| 卓资县| 瑞安市| 新民市| 天长市| 环江| 万源市| 通渭县| 高要市| 雷波县| 渑池县| 洪湖市|