Java使用stream把list集合转化为树形结构(一行解决超简单递归)
一、前言
我们在日常开发中,必不可少的就是树形结构。有的时候可以使用 mybatis的resultMap 进行转化,有的时候需要进行Java进行手动转化为树结构。今天和大家分析一个JDK8新特性Stream 来实现list到树形结构的转化!二、创建返回前端的实体类VOimport lombok.Data; import java.util.List; /** * @author wangzhenjun * @date 2022/2/28 10:28 */ @Data public class NodeVO { private String id; private String name; private String pid; private List children; public NodeVO(String id, String name, String pid) { this.id = id; this.name = name; this.pid = pid; } } 三、list转树形方法public static List streamToTree(List treeList, String parentId) { List list = treeList.stream() // 过滤父节点 .filter(parent -> parent.getPid().equals(parentId)) // 把父节点children递归赋值成为子节点 .map(child -> { child.setChildren(streamToTree(treeList,child.getId())); return child; }).collect(Collectors.toList()); return list; } 四、测试public static void main(String[] args) { NodeVO NodeVO1 = new NodeVO("1","山东省","0"); NodeVO NodeVO2 = new NodeVO("2","青岛市","1"); NodeVO NodeVO3 = new NodeVO("3","市北区","2"); NodeVO NodeVO4 = new NodeVO("4","济南市","1"); NodeVO NodeVO5 = new NodeVO("5","浙江省","0"); NodeVO NodeVO6 = new NodeVO("6","杭州市","5"); NodeVO NodeVO7 = new NodeVO("7","西湖区","6"); List list = new ArrayList<>(); list.add(NodeVO1); list.add(NodeVO2); list.add(NodeVO3); list.add(NodeVO4); list.add(NodeVO5); list.add(NodeVO6); list.add(NodeVO7); // 默认父节点id为0 List nodeVOList = streamToTree(list,"0"); System.out.println(JSON.toJSONString(nodeVOList)); }
结果展示: [ { "children": [ { "children": [ { "children": [], "id": "3", "name": "市北区", "pid": "2" } ], "id": "2", "name": "青岛市", "pid": "1" }, { "children": [], "id": "4", "name": "济南市", "pid": "1" } ], "id": "1", "name": "山东省", "pid": "0" }, { "children": [ { "children": [ { "children": [], "id": "7", "name": "西湖区", "pid": "6" } ], "id": "6", "name": "杭州市", "pid": "5" } ], "id": "5", "name": "浙江省", "pid": "0" } ] 五、总结
也可以使用两个for来实现,小编还是觉得Stream比较优雅哈,哈哈哈!!如果对你有用就点个赞呗!
推广自己网站的时间到了!!!
小王博客站
C语言经典题目分享AB问题计算两个10以内的两个整数的和。includestdio。hintmain()inta,b,c0scanf(dd,a,b)if((a0a10)(b0b10))cabprin
ts类型断言(二)一将任何一个类型断言为anyts的类型系统运转良好,每个值类型都具体而精确。当我们引用一个在此类型上不存在的属性或方法时,就会报错constnumnumber1num。length
西门子1500PLC实现PLC变量中关键字段提取编程实验前景字的逻辑运算指令包括与运算(AND)或运算(OR)异或运算(XOR)求反码(INVERT)解码(DECO)编码(ENCO)选择(SEL)多路复用(MUX)和多路分用(DEMUX
自定义validation注解解决动态多字段联动校验问题欢迎大家关注今日头条号JAVA前线查看更多精彩分享文章,主要包括源码分析实际应用架构思维职场分享产品思考1文章概述javax。validation是基于JSR303标准定义的一组接
Java中final修饰的变量是如何赋值的?众所周知,在Java中,final关键字可以修饰变量,方法和类。它们表达的意义如下1修饰变量该变量赋值之后不可再修改或重新赋值,这种变量可以当成常量使用2修饰方法方法不可被重写3修
可能是最便宜的ROG败家之眼,月刃鼠标降至199,入手评测众所周知,华硕的ROG败家之眼品牌主打电竞概念。先不说质量如何,无论是显示器笔记本还是键鼠外设,从价格上一直是高高在上。一个小小的鼠标动辄三四百的起售价确实让我等囊中羞涩玩家望而却
如何理解几种常见的垃圾收集器什么是垃圾收集器如果说垃圾收集算法是Java垃圾回收的方法论,那么垃圾收集器就是Java垃圾回收的具体实现方式,Java虚拟机厂商对垃圾回收器应该如何实现并没有明确的规定,不同厂商
Python容器列表元组和列表所含元素的种类可以不同,每个元素都可以是任何Python类型的对象。列表列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常发生改变时。与字符串不同,列表
大规模计算产生巨量碳足迹荷兰莱顿大学的天体物理学家SimonPortegiesZwart富有生态意识。他几乎不再因为工作缘故坐飞机,而是选择乘火车出行。我喜欢成为素食环保主义者,尽量减少自己的碳足迹,同时
华为官宣手机回归,关键领域已突破,14nm堆叠只差最后一道工序真的激动,让人触不及防,就在国产手机冲击高端集体失败,被苹果按在地上,我们已经不抱希望的时候。突然,余承东官宣,华为手机开始回归,并声称今年的供应得到极大改善,我们想买就能买到华为
开放式耳机怎么选,横评索尼Cleer韶音BOSE总有一款适合你引言就在2021年TWS行业峰会上,前BOSE高管李浩乾首次提出了OWS概念(OpenWearableStereo开放式可穿戴立体声系统),对比TWS耳机需要入耳或半入耳的结构,长
席卷东南亚的中国神药,590元粒供不应求,国内几乎13亿人不了解国内关于中医是不是骗局的话题,正反两方的争议不可开交,包括罗振宇都卷入进去,打了一场口水战。实际上2019年我国中药类商品进出口贸易总额已经达到61。74亿美元,其中光是出口总额就
打败外资,连续9年销量第1,国产隐形冠军年入120亿专利5千个对于家电四大件电视冰箱洗衣机和空调相关的品牌,相信很多国人都不陌生,在这个市场TCL海信海尔长虹创维美的格力都是在国内品牌响当当的公司,近20年来广告露出的频率也相对较高,因此在国
云锋基金仅2个股东,马云占40黄鑫占60,为啥名称却叫云锋对于中国的创业者来说,风险投资机构几乎就是救世主,记得在2014年左右,国内互联网创业模式兴起,出现了大大小小的投资公司,甚至一些个人也拿钱砸入小的创业型机构,实际上这个时候马云也
绿厂三子终于联合在手机上提到欧加你们会想到什么?肯定会想到这种数据造假,垃圾配置,用来欺骗老人小孩的山寨机。山寨机为了能和品牌厂商有点关系也是煞费苦心,名字上就和大厂各种相近,像是vivivjvj
联发科要崛起了吗?昨天发布的荣耀畅想z采用联发科天玑800处理器,6。5寸90hz的lcd水滴屏,4000mAh电池加22。5W快充。相较于采用麒麟7系列的荣耀机型其竞争力可以说是增加了不少的。今年
2020年下半年新机预测魔幻开年的2020年已经过去一半了,上半年的新机都已经发布完毕,除了那个上半年就开始预热到现在才明确发布的拯救者电竞手机,接下来各厂家都应该是在准备下半年的新机了,这里就来根据网络
如果华为倒下了会怎样这几天最受关注的话题莫过于美国对华为的制裁升级,从芯片代工技术方面来限制华为的发展。美国的套路也就能从芯片方面下手了,可还是一下手就是最狠最有用的一手。没办法,我国的半导体行业就是
荣耀会摆脱华为光环吗我们都知道目前荣耀已经是被华为出售,成为了一个万全独立的企业,但是在大多数人的认知中依旧是华为荣耀,荣耀依旧可以凭借华为的光环进行宣传。那么荣耀会主动摆脱华为光环吗?荣耀摆脱华为光
大秦转债中签号出炉大秦转债本次发行总额320亿元,申购人数831万,中签率56。5,平均2户才能中一签,网上发行占本次发行总量的14。68,最终向发行人原股东优先配售的大秦转债为23,187,705
12月18日新乳转债申购可转债打新申购可转债,就是看它的转股价值,大于100就值得申购,如果低于100太多,就要谨慎。可转债评级等级越高,破发率越低。目前2020年可转债打新开盘首日还无一破发,单签收益在
北陆转债润建转债中签号出炉北陆转债本次发行总额5。00亿元,申购人数825万,中签率1。7,平均59户才能中一签,网上发行占本次发行总量的28。57,最终向原股东优先配售的北陆转债总计357。15万张,即3