经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频
来源:cnblogs  作者:赛先生和泰先生  时间:2022/11/23 18:52:08  对本文有异议

一、序言

在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率。

本文将基于Java8的Lambda 表达式和Stream等知识,使用TreeUtils工具类实现一行代码完成列表转树这一通用型需求。本文有配套视频,传送门直达。

需要说明的是,本TreeUtils工具类已进行三版优化,能够胜任生产场景绝大多数列表转树的。

二、实战编码

1、引入坐标

本坐标地址包含TreeUtils工具类方法,已经发布到Maven中央仓库,建议使用最新的版本号,本文发布时版本是1.5.8.3,若有最新版本,建议使用最新版本。

学习源码的朋友,源码直通车

  1. <dependency>
  2. <groupId>xin.altitude.cms</groupId>
  3. <artifactId>ucode-cms-common</artifactId>
  4. <version>1.5.8.3</version>
  5. </dependency>
2、编写DO

DO是访问数据库实体类,属于前期准备素材。

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @TableName(value = "bu_category3")
  5. public class Category {
  6. private static final long serialVersionUID = 1L;
  7. @TableId(type = IdType.AUTO)
  8. private String id;
  9. private String name;
  10. private String parentId;
  11. private String remark;
  12. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  13. private LocalDateTime createTime;
  14. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  15. private LocalDateTime updateTime;
  16. public Category(Category category) {
  17. if (Objects.nonNull(category)) {
  18. this.id = category.id;
  19. this.name = category.name;
  20. this.parentId = category.parentId;
  21. this.remark = category.remark;
  22. this.createTime = category.createTime;
  23. this.updateTime = category.updateTime;
  24. }
  25. }
  26. }
3、创建BO

创建BO数据模型用于构造属性结点

  1. @Data
  2. @NoArgsConstructor
  3. public class CategoryBo {
  4. private String id;
  5. private String name;
  6. private String parentId;
  7. private String remark;
  8. /**
  9. * 孩子结点 名字任意取
  10. */
  11. private List<CategoryBo> childList;
  12. /**
  13. * 实现Category 转 CategoryBo
  14. *
  15. * @param category
  16. */
  17. public CategoryBo(Category category) {
  18. if (Objects.nonNull(category)) {
  19. this.id = category.getId();
  20. this.name = category.getName();
  21. this.parentId = category.getParentId();
  22. this.remark = category.getRemark();
  23. }
  24. }
  25. }
3、调用TreeUtils工具类

在服务层调用TreeUtils工具类,一行代码完成转换。

  1. /**
  2. * 获取DO中指定的属性 并构造成树
  3. * @return
  4. */
  5. public List<CategoryBo> selectCategory4() {
  6. List<Category> categoryList = this.list();
  7. List<CategoryBo> categoryBoList = EntityUtils.toList(categoryList, CategoryBo::new);
  8. return TreeUtils.createNodeDetail(categoryBoList, "000000", CategoryBo::getId, CategoryBo::getParentId, CategoryBo::getChildList);
  9. }
4、效果展示

原始列表数据

  1. {
  2. "code": 200,
  3. "msg": "操作成功",
  4. "data": [
  5. {
  6. "id": "310000",
  7. "name": "电子商务",
  8. "parentId": "000000",
  9. "remark": "EEEEE",
  10. "createTime": null,
  11. "updateTime": "2021-11-21 11:22:40"
  12. },
  13. {
  14. "id": "310100",
  15. "name": "大宗商品",
  16. "parentId": "310000",
  17. "remark": "JJJJJ",
  18. "createTime": null,
  19. "updateTime": "2021-11-21 11:22:52"
  20. },
  21. {
  22. "id": "310101",
  23. "name": "大宗商品综合",
  24. "parentId": "310100",
  25. "remark": "IIIII",
  26. "createTime": null,
  27. "updateTime": "2021-11-21 11:22:58"
  28. },
  29. {
  30. "id": "310102",
  31. "name": "钢铁类电商",
  32. "parentId": "310100",
  33. "remark": "OOOOO",
  34. "createTime": null,
  35. "updateTime": "2021-11-21 11:23:02"
  36. },
  37. {
  38. "id": "310200",
  39. "name": "综合电商",
  40. "parentId": "310000",
  41. "remark": "NNNNN",
  42. "createTime": null,
  43. "updateTime": "2021-11-21 11:23:07"
  44. }
  45. ]
  46. }

树状层次数据

  1. {
  2. "code": 200,
  3. "msg": "操作成功",
  4. "data": [
  5. {
  6. "id": "310000",
  7. "name": "电子商务",
  8. "parentId": "000000",
  9. "remark": "EEEEE",
  10. "childList": [
  11. {
  12. "id": "310100",
  13. "name": "大宗商品",
  14. "parentId": "310000",
  15. "remark": "JJJJJ",
  16. "childList": [
  17. {
  18. "id": "310101",
  19. "name": "大宗商品综合",
  20. "parentId": "310100",
  21. "remark": "IIIII",
  22. "childList": []
  23. },
  24. {
  25. "id": "310102",
  26. "name": "钢铁类电商",
  27. "parentId": "310100",
  28. "remark": "OOOOO",
  29. "childList": []
  30. }
  31. ]
  32. },
  33. {
  34. "id": "310200",
  35. "name": "综合电商",
  36. "parentId": "310000",
  37. "remark": "NNNNN",
  38. "childList": []
  39. }
  40. ]
  41. }
  42. ]
  43. }

三、小结

通过一个小小的高频业务场景,抽离业务共性,屏蔽业务细节,实现了通用型业务逻辑的编码。

希望广大技术朋友在完成日常开发工作的前提下,能够进一步打磨代码,感受编程之美。

原文链接:https://www.cnblogs.com/javazhishitupu/p/16914381.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号