创建一个模拟MenuTree 对象

/**
 * @author songzixian
 */
@Data
@Builder
public class MenuTree {
    /**
     * id
     */
    public Integer id;
    /**
     * 名称
     */
    public String name;
    /**
     * 父id ,根节点为0
     */
    public Integer parentId;
    /**
     * 子节点信息
     */
    public List<MenuTree> childList;


    public MenuTree(Integer id, String name, Integer parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }

    public MenuTree(Integer id, String name, Integer parentId, List<MenuTree> childList) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.childList = childList;
    }
}

创建TestTree测试类

public class TestTree {

    @Test
    public void testtree() {
        //模拟从数据库查询出来
        List<MenuTree> menus = Arrays.asList(
                new MenuTree(1, "根节点", 0),
                new MenuTree(2, "子节点1", 1),
                new MenuTree(3, "子节点1.1", 2),
                new MenuTree(4, "子节点1.2", 2),
                new MenuTree(5, "根节点1.3", 2),
                new MenuTree(6, "根节点2", 1),
                new MenuTree(7, "根节点2.1", 6),
                new MenuTree(8, "根节点2.2", 6),
                new MenuTree(9, "根节点2.2.1", 7),
                new MenuTree(10, "根节点2.2.2", 7),
                new MenuTree(11, "根节点3", 1),
                new MenuTree(12, "根节点3.1", 11)
        );

        //获取父节点
        List<MenuTree> 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(JSONUtil.toJsonStr(collect));
    }

    /**
     * 递归查询子节点
     *
     * @param root 根节点
     * @param all  所有节点
     * @return 根节点信息
     */
    private List<MenuTree> getChildrens(MenuTree root, List<MenuTree> all) {
        List<MenuTree> 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;
    }
}

运行输出一个Json树形结构
Java8 Stream流递归实现树形结构.png

Last modification:April 9, 2022
如果觉得这篇技术文章对你有用,请随意赞赏