java使用stream流创建低深度树形结构


    public static List<Node> buildSourceData() {
        // 124  35
        return new ArrayList<>(){{

            add(new Node(1, 0, "一"));
            add(new Node(2, 1, "二"));
            add(new Node(3, 2, "三"));
            add(new Node(4, 1, "四"));
            add(new Node(5, 4, "五"));
            add(new Node(6, 0, "6"));
            add(new Node(7, 0, "7"));
            add(new Node(8, 6, "8"));
            add(new Node(9, 6, "9"));
        }};
    }


    public static void main(String[] args) {
        List<Node> nodes = buildSourceData();
        List<Node> nodes1 = buildTree(nodes);

        System.out.println(JSON.toJSONString(nodes1));
    }

    public static List<Node> buildTree(List<Node> nodes) {
        // 1. 过滤出pid 非0数据  2.根据pid分组,供后续查询      
        Map<Integer, List<Node>> nodeMap = nodes.stream().filter(node -> node.getPid() != 0)
                .collect(Collectors.groupingBy(Node::getPid));

        // 使用id = pid循环获取
        nodes.forEach(node -> node.setTreeNode(nodeMap.get(node.getId())));
        
        // 获取第一层pid不是0的数据,没有根节点的数据
        return nodes.stream().filter(node -> node.getPid() == 0).toList();
    }

    public static class Node {
        private Integer id;

        private Integer pid;

        private String name;

        private List<Node> treeNode = new ArrayList<>();


        public List<Node> getTreeNode() {
            return treeNode;
        }

        public void setTreeNode(List<Node> treeNode) {
            this.treeNode = treeNode;
        }

        public Node() {
        }

        public Node(Integer id, Integer pid, String name) {
            this.id = id;
            this.pid = pid;
            this.name = name;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public Integer getPid() {
            return pid;
        }

        public void setPid(Integer pid) {
            this.pid = pid;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
posted @   XSWClevo  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示