Java8新特性-使用Stream流遞歸實現遍歷樹形結構


一、簡介

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

實體類:Menu.java

@Data
@Builder
public class Menu {

    public Integer id;

    public String name;

    public Integer parentId;

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

 

二、遞歸組裝樹形結構

    @Test
    public void testtree(){
        //模擬從數據庫查詢出來
        List<Menu> menus = Arrays.asList(
                new Menu(1,"根節點",0),
                new Menu(2,"子節點1",1),
                new Menu(3,"子節點1.1",2),
                new Menu(4,"子節點1.2",2),
                new Menu(5,"根節點1.3",2),
                new Menu(6,"根節點2",1),
                new Menu(7,"根節點2.1",6),
                new Menu(8,"根節點2.2",6),
                new Menu(9,"根節點2.2.1",7),
                new Menu(10,"根節點2.2.2",7),
                new Menu(11,"根節點3",1),
                new Menu(12,"根節點3.1",11)
        );

        //獲取父節點
        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("-------轉json輸出結果-------");
        System.out.println(JSON.toJSON(collect));
    }

    /**
     * 遞歸查詢子節點
     * @param root  根節點
     * @param all   所有節點
     * @return 根節點信息
     */
    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;
    }

 

三、格式化打印結果

 

 

 

轉載自:https://blog.csdn.net/qq_19244927/article/details/106481777


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM