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

发布时间 2023-09-11 10:02:57作者: XSWClevo

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