百木园-与人分享,
就是让自己快乐。

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、编写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\": []
        }
      ]
    }
  ]
}

三、小结

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

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

喜欢本文就【♥️推荐♥️】一下,激励我持续创作。这个Github同样精彩,收到您的star我会很激动。本文归档在专题博客,视频讲解在B站。


来源:https://www.cnblogs.com/javazhishitupu/p/16914381.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频

相关推荐

  • 暂无文章