首页 > 其他分享 >TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频

TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频

时间:2022-11-22 10:57:06浏览次数:78  
标签:category remark name 转树 TreeUtils private parentId id 三级

一、序言

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

本文将基于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、编写DO

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

@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": []
        }
      ]
    }
  ]
}

三、小结

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

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

标签:category,remark,name,转树,TreeUtils,private,parentId,id,三级
From: https://www.cnblogs.com/javazhishitupu/p/16914381.html

相关文章

  • 等保三级,多级等保认证的一点了解
    2022年11月21日10:28:28信息安全等级保护管理办法信息系统的安全保护等级分为以下五级:第一级,信息系统受到破坏后,会对公民、法人和其他组织的合法权益造成损害,但不损害国......
  • 等保二级、三级的区别
    等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等......
  • Jquery实现省市县三级联动
    <selectname="sltPro"id="sltPro"></select><selectname="sltCity"id="sltCity"></select><selectname="sltCounty"id="sltCounty"></select......
  • TreeUtils工具类一行代码实现列表转树 实战Java8 三级菜单 三级分类 附视频
    一、序言在日常一线开发过程中,总有列表转树的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦......
  • 我把 CPU 三级缓存的秘密,藏在这 8 张图里
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]进Android面试交流群。前言大家好,我是小彭。在......
  • 常用的用户名和密码的三级验证
    //用户名匹配exportfunctionnameRule(rule,value,callback){//请输入4-10位昵称letreg=/(^[a-zA-Z0-9]{4,10}$)/;if(value===""){callback(newError("......
  • java三级菜单遍历
     java三级菜单遍历@OverridepublicList<YjztCity>getYjzt(){List<YjztCity>yjztCities=yjztCityMapper.selectByExample(null);//先获取你想要......
  • Spring三级缓存解决循环依赖
    前提知识1、解决循环依赖的核心依据:实例化和初始化步骤是分开执行的2、实现方式:三级缓存3、lambda表达式的延迟执行特性spring源码执行逻辑核心方法refresh(), populateBea......
  • 【Vue】可编辑表格与三级联动下拉
    需求是给员工分配岗位,设计上是一人多岗的存在...单位—— 部门—— 岗位 这样的层级功能效果:因为员工可以在不同的单位下任职岗位,所以这个每一个岗位都是一个独立......
  • 三级指针动态分配/释放内存(C / C++)
    C语言版本#include<stdio.h>#include<stdlib.h>#definehigh2#definerow3#definecol4intmain(){inti,j,k;//p[2][3][4]int......