Java用stream归纳树形结构
Java知识点整理正在进行中,关注我,持续给您带来简单,实用的Java编程技巧。
在Java开发中,有时候会遇到将存在父子关系的集合转化为树形接口的场景,比如菜单数据的处理。这时可以使用stream归纳出树形结构。
具体看代码:存在父子关系的实体类Node表示节点packagecom。bbzd。stream。treelist;importjava。util。List;节点实体类包含子节点列表childrenListdate202210320:59publicclassNode{节点IDprivateStringid;节点名称privateStringname;父节点IDprivateStringpid;子节点列表privateListNodechildrenList;publicNode(Stringid,Stringname,Stringpid){this。idid;this。namename;this。pidpid;}为了节省篇幅,此处省去get,set方法OverridepublicStringtoString(){returnNode{idid,namename,pidpid,childrenListchildrenList};}}使用stream进行归纳的示例类packagecom。bbzd。stream。treelist;importjava。util。ArrayList;importjava。util。List;importjava。util。stream。Collectors;示例:用流的方式归纳树型结构节点date202210321:04publicclassStreamTreeListDemo{publicstaticvoidmain(String〔〕args){节点信息,一级节点是省,二级节点是市,三级节点是区节点关系:河北省沧州市华新区运河区河南省开封市鼓楼区龙亭区Nodenode1newNode(1,河北省,0);Nodenode2newNode(2,沧州市,1);Nodenode3newNode(3,华新区,2);Nodenode4newNode(4,运河区,2);Nodenode5newNode(5,河南省,0);Nodenode6newNode(6,开封市,5);Nodenode7newNode(7,鼓楼区,6);Nodenode8newNode(8,龙亭区,6);ListNodenodeListnewArrayList();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代表一级节点ListNodetreeListstreamToTree(nodeList,0);输出显示归纳后的结果System。out。println(treeList);}将节点列表归纳成树结构的方式paramnodeList节点列表parampid父节点IDreturn树结构的节点publicstaticListNodestreamToTree(ListNodenodeList,Stringpid){ListNodelistnodeList。stream()过滤一级节点。filter(parentparent。getPid()。equals(pid))对二级节点和三级递归进行归纳,归纳到对应的父节点上。map(child{child。setChildrenList(streamToTree(nodeList,child。getId()));returnchild;})。collect(Collectors。toList());returnlist;}}
程序处理后,节点集合已经按父子关系归纳成了树形结构,输出结果
Node{id1,name河北省,pid0,childrenList〔Node{id2,name沧州市,pid1,childrenList〔Node{id3,name华新区,pid2,childrenList〔〕},Node{id4,name运河区,pid2,childrenList〔〕}〕}〕},Node{id5,name河南省,pid0,childrenList〔Node{id6,name开封市,pid5,childrenList〔Node{id7,name鼓楼区,pid6,childrenList〔〕},Node{id8,name龙亭区,pid6,childrenList〔〕}〕}〕}
总结用stream归纳树形结构代码看起来比较简洁,挺好。本例中使用的stream特性属于比较晦涩的概念,看不懂的小伙伴也不要着急,先记下来有这种用法姐可以了。关注我,后面我会单独写些文章来阐述说明stream特性。