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

将包含父子关系的扁平列表 List<Demo> 转换成树形结构的 List<DemoVO>,每个节点包含自己的子节点列表

 1.stream递归操作

    private List<DemoVO> createtree(List<Demo> datas) {//得到父节点return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo = new DemoVO();vo.setTaxonomyId(m.getPlatformTaxonomyId());vo.setTaxonomyName(m.getPlatformTaxonomyName());vo.setType(m.getType());vo.setStatus(m.getStatus());vo.setUpdateTime(m.getUpdateTime());vo.setChildren(buildChildNodes(m, datas));return vo;}).collect(Collectors.toList());}private List<DemoVO> buildChildNodes(Demo root, List<Demo> list){return list.stream().filter(m -> Objects.equals(root.getPlatformTaxonomyId(), m.getParentId())).map(m -> {DemoVO vo = new DemoVO();vo.setTaxonomyId(m.getPlatformTaxonomyId());vo.setTaxonomyName(m.getPlatformTaxonomyName());vo.setType(m.getType());vo.setStatus(m.getStatus());vo.setUpdateTime(m.getUpdateTime());vo.setChildren(buildChildNodes(m, list));return vo;}).collect(Collectors.toList());}

关键点

  1. 递归算法

    • 通过 buildChildNodes 方法递归构建子树,直到没有子节点为止。

  2. 数据关联

    • 通过 parentId 和 platformTaxonomyId 的匹配建立父子关系。

  3. 不变性

    • 假设 Demo是只读的,每次递归创建新的 DemoVO 对象。

2.使用栈或队列的迭代方式可避免递归深度问题(适合超深层级数据):

private List<DemoVO> createTreeIterative(List<Demo> datas) {Map<String, DemoVO> nodeMap = new HashMap<>();Map<String, List<Demo>> parentToChildren = datas.stream().collect(Collectors.groupingBy(Demo::getParentId));// 所有节点预创建datas.forEach(data -> {DemoVO vo = new DemoVO();vo.setTaxonomyId(data.getPlatformTaxonomyId());vo.setTaxonomyName(data.getPlatformTaxonomyName());nodeMap.put(data.getPlatformTaxonomyId(), vo);});// 构建父子关系nodeMap.values().forEach(vo -> {List<Demo> childrenData = parentToChildren.get(vo.getTaxonomyId());if (childrenData != null) {vo.setChildren(childrenData.stream().map(child -> nodeMap.get(child.getPlatformTaxonomyId())).collect(Collectors.toList()));}});// 返回根节点return parentToChildren.getOrDefault(TargetConstants.ROOT, Collections.emptyList()).stream().map(root -> nodeMap.get(root.getPlatformTaxonomyId())).collect(Collectors.toList());
}

http://www.xdnf.cn/news/1019125.html

相关文章:

  • 年化收益237%的策略,12年年化是38%,支持配置最小日期,附aitrader_1.5代码发布
  • 爬虫技术栈解析:XPath与BeautifulSoup的深度对比与实践指南
  • WPF数据绑定疑惑解答--(关于控件的Itemsource,Collection绑定)
  • 获取Linux设备系统启动时间和进程启动时间
  • 基于Netty的UDPServer端和Client端解决正向隔离网闸数据透传问题
  • 前端八股文-vue篇
  • 2025-06-13【视频处理】基于视频内容转场进行分割
  • 深度剖析:AI 社媒矩阵营销工具,如何高效获客?
  • 实验复现:应用 RIR 触发器的 TrojanRoom 后门攻击实现
  • Java虚拟机解剖:从字节码到机器指令的终极之旅(二)
  • 【第一章:人工智能基础】03.算法分析与设计-(4)贪心算法(Greedy Algorithm)
  • C++ 中文件 IO 操作详解
  • 软件开发 | 从 Azure DevOps迁移至GitHub企业版的最佳路径
  • HTTP全攻略:从入门到精通
  • @RequestHeader(“Authorization“) 解析:HTTP 请求头中的 Authorization 字段
  • JSON 编辑器:从语法到数据处理(二)
  • 在C#中乐观锁的实现
  • ios 26发布:设计革新与智能整合
  • 分析实例,学习了解浏览器事件循环机制
  • 基于ssm的教学质量评估系统
  • CIM和建筑风貌管控平台
  • [7-01-03].第03节:环境搭建 - 集群架构
  • Java企业技术趋势分析:AI应用的落地实践与未来展望
  • nuxt2报错Unexpected token ‘{‘
  • CSS flex-basis 属性详解:功能、用法与最佳实践
  • CSS Houdini 解锁前端动画的下一个时代!
  • 主流版本控制工具Git vs Perforce P4:架构模式、性能、大文件管理及分支管理对比详解
  • 在线教程丨刷新TTS模型SOTA,OpenAudio S1基于200万小时音频数据训练,深刻理解情感及语音细节
  • 引入 Kafka 消息队列解耦热点操作
  • list使用及模拟