当前位置: 首页 > news >正文

Java 8 中的 Stream 轻松遍历树形结构

直接上代码

测试实体类

/*** Menu** @author lcry*/
@Data
@Builder
public class Menu {/*** id*/public Integer id;/*** 名称*/public String name;/*** 父id ,根节点为0*/public Integer parentId;/*** 子节点信息*/public List<Menu> childList;public Menu(Integer id, String name, Integer parentId) {this.id = id;this.name = name;this.parentId = parentId;}public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {this.id = id;this.name = name;this.parentId = parentId;this.childList = childList;}}

核心代码:

@Test
public void testtree(){//模拟从数据库查询出来,公众号Java精选,有惊喜!List<Menu> menus = Arrays.asList(new Menu(1,"根节点",0),new Menu(2,"子节点1",1),new Menu(3,"子节点1.1",2),new Menu(4,"子节点1.2",2),new Menu(5,"根节点1.3",2),new Menu(6,"根节点2",1),new Menu(7,"根节点2.1",6),new Menu(8,"根节点2.2",6),new Menu(9,"根节点2.2.1",7),new Menu(10,"根节点2.2.2",7),new Menu(11,"根节点3",1),new Menu(12,"根节点3.1",11));//获取父节点List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map((m) -> {m.setChildList(getChildrens(m, menus));return m;}).collect(Collectors.toList());System.out.println("-------转json输出结果-------");System.out.println(JSON.toJSON(collect));
}/*** 递归查询子节点* @param root  根节点* @param all   所有节点* @return 根节点信息*/
private List<Menu> getChildrens(Menu root, List<Menu> all) {List<Menu> children = all.stream().filter(m -> {return Objects.equals(m.getParentId(), root.getId());}).map((m) -> {m.setChildList(getChildrens(m, all));return m;}).collect(Collectors.toList());return children;
}

打印效果

在这里插入图片描述

相关文章:

  • 视频转为序列图的软件,让视频批量转为序列图
  • Object.keys()
  • Go语言学习记录——用正则表达式(regexp包)来校验参数
  • mysql进阶-索引基础
  • 高效构建Java应用:Maven入门和进阶(五)
  • 【JavaScript】es6开发常用技巧
  • Page 251~254 Win32 GUI项目
  • 使用MATLAB连接USRP
  • 6、C语言:输入与输出
  • [学习笔记]刘知远团队大模型技术与交叉应用L1-NLPBig Model Basics
  • 常见设计模式--通俗易懂版
  • 使用Spring Boot集成中间件:Elasticsearch基础->提高篇
  • [力扣 Hot100]Day2 字母异位词分组
  • springCould中的Bus-从小白开始【11】
  • 数据库管理-第130期 JSON二元性(20240109)
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android框架之Volley
  • Date型的使用
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • js递归,无限分级树形折叠菜单
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React+TypeScript入门
  • Vue.js 移动端适配之 vw 解决方案
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 闭包--闭包之tab栏切换(四)
  • 日剧·日综资源集合(建议收藏)
  • 如何合理的规划jvm性能调优
  • 如何选择开源的机器学习框架?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实现简单的正则表达式引擎
  • 你对linux中grep命令知道多少?
  • 7行Python代码的人脸识别
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (10)ATF MMU转换表
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (一)Dubbo快速入门、介绍、使用
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)Google Chrome调试JS
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net MVC + EF搭建学生管理系统
  • .net 反编译_.net反编译的相关问题
  • .net 流——流的类型体系简单介绍
  • .NET 事件模型教程(二)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net和php怎么连接,php和apache之间如何连接
  • .Net语言中的StringBuilder:入门到精通
  • [2023年]-hadoop面试真题(一)
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [iOS]iOS获取设备信息经常用法
  • [JavaWeb]—前端篇
  • [LeetCode]: 145: Binary Tree Postorder Traversal