列表转换为树(TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频)
一 、序言
在日常一线开发过程中 ,总有列表转树的需求 ,几乎是项目的标配 ,比方说做多级菜单 、多级目录 、多级分类等 ,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身 ,提高开发效率 。
本文将基于Java8的Lambda 表达式和Stream等知识 ,使用TreeUtils工具类实现一行代码完成列表转树这一通用型需求 。本文有配套视频 ,传送门直达 。
需要说明的是 ,本TreeUtils工具类已进行三版优化 ,能够胜任生产场景绝大多数列表转树的 。
二 、实战编码
1 、引入坐标本坐标地址包含TreeUtils工具类方法 ,已经发布到Maven中央仓库 ,建议使用最新的版本号 ,本文发布时版本是1.5.8.3,若有最新版本 ,建议使用最新版本 。
学习源码的朋友 ,源码直通车
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-common</artifactId> <version>1.5.8.3</version> </dependency> 2 、编写DODO是访问数据库实体类,属于前期准备素材 。
@Data @NoArgsConstructor @AllArgsConstructor @TableName(value = "bu_category3") public class Category { private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private String id; private String name; private String parentId; private String remark; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; public Category(Category category) { if (Objects.nonNull(category)) { this.id = category.id; this.name = category.name; this.parentId = category.parentId; this.remark = category.remark; this.createTime = category.createTime; this.updateTime = category.updateTime; } } } 3 、创建BO创建BO数据模型用于构造属性结点
@Data @NoArgsConstructor public class CategoryBo { private String id; private String name; private String parentId; private String remark; /** * 孩子结点 名字任意取 */ private List<CategoryBo> childList; /** * 实现Category 转 CategoryBo * * @param category */ public CategoryBo(Category category) { if (Objects.nonNull(category)) { this.id = category.getId(); this.name = category.getName(); this.parentId = category.getParentId(); this.remark = category.getRemark(); } } } 3 、调用TreeUtils工具类在服务层调用TreeUtils工具类 ,一行代码完成转换 。
/** * 获取DO中指定的属性 并构造成树 * @return */ public List<CategoryBo> selectCategory4() { List<Category> categoryList = this.list(); List<CategoryBo> categoryBoList = EntityUtils.toList(categoryList, CategoryBo::new); return TreeUtils.createNodeDetail(categoryBoList, "000000", CategoryBo::getId, CategoryBo::getParentId, CategoryBo::getChildList); } 4 、效果展示原始列表数据
{ "code": 200, "msg": "操作成功", "data": [ { "id": "310000", "name": "电子商务", "parentId": "000000", "remark": "EEEEE", "createTime": null, "updateTime": "2021-11-21 11:22:40" }, { "id": "310100", "name": "大宗商品", "parentId": "310000", "remark": "JJJJJ", "createTime": null, "updateTime": "2021-11-21 11:22:52" }, { "id": "310101", "name": "大宗商品综合", "parentId": "310100", "remark": "IIIII", "createTime": null, "updateTime": "2021-11-21 11:22:58" }, { "id": "310102", "name": "钢铁类电商", "parentId": "310100", "remark": "OOOOO", "createTime": null, "updateTime": "2021-11-21 11:23:02" }, { "id": "310200", "name": "综合电商", "parentId": "310000", "remark": "NNNNN", "createTime": null, "updateTime": "2021-11-21 11:23:07" } ] }树状层次数据
{ "code": 200, "msg": "操作成功", "data": [ { "id": "310000", "name": "电子商务", "parentId": "000000", "remark": "EEEEE", "childList": [ { "id": "310100", "name": "大宗商品", "parentId": "310000", "remark": "JJJJJ", "childList": [ { "id": "310101", "name": "大宗商品综合", "parentId": "310100", "remark": "IIIII", "childList": [] }, { "id": "310102", "name": "钢铁类电商", "parentId": "310100", "remark": "OOOOO", "childList": [] } ] }, { "id": "310200", "name": "综合电商", "parentId": "310000", "remark": "NNNNN", "childList": [] } ] } ] }三 、小结
通过一个小小的高频业务场景 ,抽离业务共性 ,屏蔽业务细节 ,实现了通用型业务逻辑的编码 。
希望广大技术朋友在完成日常开发工作的前提下 ,能够进一步打磨代码 ,感受编程之美 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!