Java-用stream归纳树形结构

Java知识点整理正在进行中,关注我,持续给您带来简单,实用的Java编程技巧。

在Java开发中,有时候会遇到将存在父子关系的集合转化为树形接口的场景,比如菜单数据的处理。这时可以使用stream归纳出树形结构。

具体看代码:

存在父子关系的实体类Node表示节点

package com.bbzd.stream.treelist;

import java.util.List;

/**
 * 节点实体类
 *  包含子节点列表childrenList
 * @date 2022/10/3 - 20:59
 */
public class Node {
    //节点ID
    private String id;
    //节点名称
    private String name;
    //父节点ID
    private String pid;
    //子节点列表
    private List childrenList;

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

    /*
    为了节省篇幅,此处省去get,set方法
    */

    @Override
    public String toString() {
        return "Node{" +
                "id='" + id + ''' +
                ", name='" + name + ''' +
                ", pid='" + pid + ''' +
                ", childrenList=" + childrenList +
                '}';
    }
}

使用stream进行归纳的示例类

package com.bbzd.stream.treelist;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 示例:用流的方式归纳树型结构节点
 * @date 2022/10/3 - 21:04
 */
public class StreamTreeListDemo {

    public static void main(String[] args) {

        /*节点信息,一级节点是省,二级节点是市,三级节点是区
        节点关系:
        河北省 -> 沧州市  -> 华新区
                         -> 运河区
        河南省 -> 开封市  -> 鼓楼区
                         -> 龙亭区
         */
        Node node1=new Node("1","河北省","0");
        Node node2=new Node("2","沧州市","1");
        Node node3=new Node("3","华新区","2");
        Node node4=new Node("4","运河区","2");
        Node node5=new Node("5","河南省","0");
        Node node6=new Node("6","开封市","5");
        Node node7=new Node("7","鼓楼区","6");
        Node node8=new Node("8","龙亭区","6");

        List nodeList=new ArrayList<>();
        nodeList.add(node1);
        nodeList.add(node2);
        nodeList.add(node3);
        nodeList.add(node4);
        nodeList.add(node5);
        nodeList.add(node6);
        nodeList.add(node7);
        nodeList.add(node8);

        //0代表一级节点
        List treeList=streamToTree(nodeList,"0");
        //输出显示归纳后的结果
        System.out.println(treeList);
    }

    /**
     * 将节点列表归纳成树结构的方式
     * @param nodeList 节点列表
     * @param pid 父节点ID
     * @return 树结构的节点
     */
    public static List streamToTree(
            List nodeList,
            String pid){

        List list=nodeList.stream()
                //过滤一级节点
                .filter(parent -> parent.getPid().equals(pid))
                //对二级节点和三级递归进行归纳,归纳到对应的父节点上
                .map(child ->{
                    child.setChildrenList(streamToTree(nodeList,child.getId()));
                    return child;
                })
                .collect(Collectors.toList());
        return list;
    }
}


程序处理后,节点集合已经按父子关系归纳成了树形结构,输出结果

Node{id='1', name='河北省', pid='0', childrenList=[Node{id='2', name='沧州市', pid='1', childrenList=[Node{id='3', name='华新区', pid='2', childrenList=[]}, Node{id='4', name='运河区', pid='2', childrenList=[]}]}]}, Node{id='5', name='河南省', pid='0', childrenList=[Node{id='6', name='开封市', pid='5', childrenList=[Node{id='7', name='鼓楼区', pid='6', childrenList=[]}, Node{id='8', name='龙亭区', pid='6', childrenList=[]}]}]}

总结

  1. 用stream归纳树形结构代码看起来比较简洁,挺好。
  2. 本例中使用的stream特性属于比较晦涩的概念,看不懂的小伙伴也不要着急,先记下来有这种用法姐可以了。关注我,后面我会单独写些文章来阐述说明stream特性。
展开阅读全文

页面更新:2024-03-25

标签:归纳   开封市   沧州市   鼓楼   结构   河北省   河南省   节点   运河   关系

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top