当前位置: 首页 > 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());
}

相关文章:

  • Python 轻量化环境管理利器 UV 入门与 Windows 下安装实战
  • 【结合JSR380自定义校验】
  • 神经网络压缩
  • PHP基础-运算符
  • 用AI思维重塑人生:像训练神经网络一样优化自己
  • Java EE 导读
  • 【Create my OS】1 最小内核
  • MySQL-DDL语句深度解析与实战指南
  • Web开发实战:Gin + GORM 构建企业级 API 项目
  • RabbitMQ的使用--项目创建、五种工作模式、高级特性
  • Blender 4.4.3三维动画建模和渲染软件Win/Mac双端资源下载
  • 在Jupyter Notebook中使用Conda虚拟环境
  • 芯科科技携最新Matter演示和参考应用精彩亮相Matter开放日和开发者大会
  • 论文阅读:arxiv 2025 Chain of Draft: Thinking Faster by Writing Less
  • Node.js 检测视频链接是否可以播放(批量检测)
  • CSS a标签内文本折行展示
  • 论文阅读:arxiv 2025 Not All Tokens Are What You Need In Thinking
  • 用 HTML、CSS 和 JavaScript 实现五子棋人机对战游戏
  • 【61 Pandas+Pyecharts | 基于Apriori算法及帕累托算法的超市销售数据分析可视化】
  • CIM和建筑风貌管控平台
  • wordpress相似的nodejs/长春网站优化
  • 网站正在建设中 给你带来/东莞网络营销网站建设
  • h5做的网站如何连接数据库/it培训机构排名
  • 百度网盟网站有哪些/湖南正规关键词优化首选
  • wordpress 转载 插件/百度seo快速排名优化软件
  • 做一个介绍网站多少钱/广州竞价托管