当前位置: 首页 > 后端技术 > Java

停止编写一堆for循环!Java8中的Stream可以轻松遍历树结构,真是牛逼!

时间:2023-04-02 10:30:36 Java

平时可能会遇到一些需求,比如建一个菜单,建一个树结构,数据库一般用parentid来表示。为了减少对数据库的查询压力,我们可以使用Java8中的Stream,将数据一次性取出来,然后通过流式处理。一起来看看吧。为了实现代码实现的简洁性,模拟将数据库中的所有数据查看到List中。实体类:Menu.java/***Menu**@authorlcry*@date2020/06/0120:36*/@Data@BuilderpublicclassMenu{/***id*/publicIntegerid;/***名称*/public字符串名称;/***父id,根节点为0*/publicIntegerparentId;/***子节点信息*/publicList

childList;publicMenu(Integerid,Stringname,IntegerparentId){this.id=id;this.name=名称;this.parentId=parentId;}publicMenu(Integerid,Stringname,IntegerparentId,ListchildList){this.id=id;这个.name=名字;this.parentId=parentId;this.childList=childList;}}递归组装树结构:@Testpublicvoidtesttree(){//模拟从数据库查询Listmenus=Arrays.asList(newMenu(1,"rootnode",0),newMenu(2,"child节点1",1),newMenu(3,"子节点1.1",2),newMenu(4,"子节点1.2",2),newMenu(5,"根节点1.3",2),newMenu(6,"根节点2",1),newMenu(7,"根节点2.1",6),newMenu(8,"根节点2.2",6),newMenu(9,"rootnode2.2.1",7),newMenu(10,"rootnode2.2.2",7),newMenu(11,"rootnode3",1),newMenu(12,"根节点3.1",11));//获取父节点Listcollect=menus.stream().filter(m->m.getParentId()==0).map((m)->{m.setChildList(getChildrens(m,menus));返回m;}).collect(Collectors.toList());System.out.println("--------转json输出结果------");System.out.println(JSON.toJSON(collect));}/***递归查询子节点*@paramroot根节点*@paramall所有节点*@return根节点信息*/privateListgetChildrens(菜单根,Listall){Listchildren=all.stream().filter(m->{returnObjects.equals(m.getParentId(),root.getId());}).map((m)->{m.setChildList(getChildrens(m,all));返回m;}).collect(Collectors.toList());returnchildren;}格式化打印结果: