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

把List<T>构建一颗树封装工具类

背景

背景不说了吧,开发中很多时候都遇得到构建一个 【树形关系】的数据场景

id:1
parentId:0id:2parentId:1id:3parentId:2id:4parentId:2

像这样:

今天封装一个工具类,专门把 List<T> 转换为 Tree<T>

正文

假设我们有一个 Person 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements NodeOfId<Person>{private Long id;private Long parentId;private String name;private List<Person> children;
}

我们需要一个 构建树形 数据节点的 基类

public interface NodeOfId<T> {Long getId();Long getParentId();void setChildren(List<T> children);
}

这个 基类 getId(),getPrentId() ,setChildren()都是可以更改的,根据你的类字段定义,只要能有构建出树形关系的字段就行

构建树封装工具类

public class TreeUtil {/*** 构造list为树集合** @param nodes* @param <T>* @return*/public static <T extends NodeOfId<T>> List<T> buildTreeList(List<T> nodes) {Map<Long, List<T>> groupMap = nodes.stream().collect(Collectors.groupingBy(T::getParentId));return nodes.stream().filter(m -> m.getParentId() == 0).peek((m) -> m.setChildren(getChildren(m, groupMap))).collect(Collectors.toList());}/*** 递归查询子节点** @param root     根节点* @param groupMap 将所有节点根据自己的父级ID进行分组* @return 根节点信息*/private static <T extends NodeOfId<T>> List<T> getChildren(T root, Map<Long, List<T>> groupMap) {return groupMap.getOrDefault(root.getId(), new ArrayList<>()).stream().peek((m) -> m.setChildren(getChildren(m, groupMap))).collect(Collectors.toList());}
}

写个单元测试:

    public static void test1() {List<Person> list = new ArrayList<>();Person person1 = new Person(1L, 0L, "A", null);Person person2 = new Person(2L, 1L, "B", null);Person person3 = new Person(3L, 2L, "C", null);Person person4 = new Person(4L, 2L, "D", null);list.add(person1);list.add(person2);list.add(person3);list.add(person4);List<Person> treeList = TreeUtil.buildTreeList(list);System.out.println(JSON.toJSONString(treeList));}

运行结果:
在这里插入图片描述
格式化看一下:
在这里插入图片描述
非常好用!!

http://www.dtcms.com/a/461887.html

相关文章:

  • GISBox v2.0.0:新增功能、问题修复、性能优化三维度,强化GIS服务核心能力
  • Qt界面布局利器:QStackedWidget详细用法解析
  • ClickHouse 配置优化与问题解决
  • 宁波网站建设果核个人网页制作教程简单
  • 白塔网站建设iis .htaccess wordpress
  • 【计算机视觉】基于复杂环境下的车牌识别
  • 域名会跳转怎么进原网站wordpress注册没用
  • YOLO26 详解:面向边缘与低功耗的端到端(NMS‑free)目标检测新范式
  • 仿win8网站建电子商务网站需要多少钱
  • 网站右下角视频代码网站免费下载安装
  • 《低压配电数字化转型实战指南》13: 技术创新:下一代配电技术探索
  • 再见的数字怎么说好听
  • Cesium 军事标绘入门:用 Cesium-Plot-JS 快速实现标绘功能
  • 【ROS2快速学习】
  • Vue3源码runtime-core运行时核心模块之provide依赖和inject注入详解
  • 网站开发个人简历word下载陕西网站建设设计
  • P2P技术
  • 面试真实经历某节跳动大厂Java和算法问答以及答案总结(一)
  • Python全栈(基础篇)——Day08:后端内容(切片+迭代+实战演示+每日一题)
  • 各大网站头条凡科免费网站可以做推广吗
  • 技术速递|GitHub 如何保护开发者免受版权执法过度影响
  • LLAVA-MINI论文阅读
  • OpenAI Agents 并行化实现
  • CNN卷计计算
  • 腾讯云服务器做网站可以吗徐州网站建设
  • 上市公司协会网站建设汇报wordpress接入qq互联
  • 前端 = [...this.orderList] (深拷贝)和this.orderList (引用赋值)
  • 部门管理|“删除部门”功能实现(Django5零基础Web平台)
  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 12--日志模块设计
  • 服务器网站源码在哪七牛云配置wordpress