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

如何使用Java 8 中的 Stream 遍歷樹形結(jié)構(gòu)

 更新時(shí)間:2023年08月11日 10:32:05   作者:吳名氏.  
這篇文章主要介紹了使用Java 8中的Stream遍歷樹形結(jié)構(gòu),我們可以使用Java8中的Stream流一次性把數(shù)據(jù)查出來,然后通過流式處理,我們一起來看看,代碼實(shí)現(xiàn)為了實(shí)現(xiàn)簡單,就模擬查看數(shù)據(jù)庫所有數(shù)據(jù)到List里面,需要的朋友可以參考下

1 前言

可能平常會(huì)遇到一些需求,比如構(gòu)建菜單,構(gòu)建樹形結(jié)構(gòu),數(shù)據(jù)庫一般就使用父id來表示,為了降低數(shù)據(jù)庫的查詢壓力,我們可以使用Java8中的Stream流一次性把數(shù)據(jù)查出來,然后通過流式處理,我們一起來看看,代碼實(shí)現(xiàn)為了實(shí)現(xiàn)簡單,就模擬查看數(shù)據(jù)庫所有數(shù)據(jù)到List里面。

2 實(shí)戰(zhàn)

2.1 實(shí)體類:Menu.java

/**
 * Menu
 * @author wuKeFan
 */
@Data
@Builder
public class Menu {
    /**
     * id
     */
    public Integer id;
    /**
     * 名稱
     */
    public String name;
    /**
     * 父id ,根節(jié)點(diǎn)為0
     */
    public Integer parentId;
    /**
     * 子節(jié)點(diǎn)信息
     */
    public List<Menu> childList;
    public Menu(Integer id, String name, Integer parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }
    public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.childList = childList;
    }
}

2.2 遞歸組裝樹形結(jié)構(gòu)

@Test
    public void testtree(){
        //模擬從數(shù)據(jù)庫查詢出來
        List<Menu> menus = Arrays.asList(
                new Menu(1,"根節(jié)點(diǎn)",0),
                new Menu(2,"子節(jié)點(diǎn)1",1),
                new Menu(3,"子節(jié)點(diǎn)1.1",2),
                new Menu(4,"子節(jié)點(diǎn)1.2",2),
                new Menu(5,"根節(jié)點(diǎn)1.3",2),
                new Menu(6,"根節(jié)點(diǎn)2",1),
                new Menu(7,"根節(jié)點(diǎn)2.1",6),
                new Menu(8,"根節(jié)點(diǎn)2.2",6),
                new Menu(9,"根節(jié)點(diǎn)2.2.1",7),
                new Menu(10,"根節(jié)點(diǎn)2.2.2",7),
                new Menu(11,"根節(jié)點(diǎn)3",1),
                new Menu(12,"根節(jié)點(diǎn)3.1",11)
        );
        //獲取父節(jié)點(diǎn)
        List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(
                (m) -> {
                    m.setChildList(getChildrens(m, menus));
                    return m;
                }
        ).collect(Collectors.toList());
        System.out.println("-------轉(zhuǎn)json輸出結(jié)果-------");
        System.out.println(JSON.toJSON(collect));
    }
    /**
     * 遞歸查詢子節(jié)點(diǎn)
     * @param root  根節(jié)點(diǎn)
     * @param all   所有節(jié)點(diǎn)
     * @return 根節(jié)點(diǎn)信息
     */
    private List<Menu> getChildrens(Menu root, List<Menu> all) {
        List<Menu> children = all.stream().filter(m -> {
            return Objects.equals(m.getParentId(), root.getId());
        }).map(
                (m) -> {
                    m.setChildList(getChildrens(m, all));
                    return m;
                }
        ).collect(Collectors.toList());
        return children;
    }

2.3 格式化打印結(jié)果

在這里插入圖片描述

到此這篇關(guān)于使用Java 8 中的 Stream 遍歷樹形結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)java8 Stream 遍歷樹形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

江源县| 炉霍县| 日土县| 延津县| 湘潭市| 海伦市| 绵竹市| 通山县| 正镶白旗| 衡山县| 朝阳区| 郎溪县| 广平县| 盖州市| 高青县| 定安县| 贵阳市| 聂拉木县| 肃宁县| 东兴市| 漯河市| 樟树市| 岳西县| 秦皇岛市| 阿鲁科尔沁旗| 余干县| 徐汇区| 邯郸县| 昭通市| 枣庄市| 河东区| 望谟县| 牡丹江市| 古浪县| 营山县| 绥中县| 增城市| 大同市| 安庆市| 阜康市| 乌拉特前旗|