Java利用TreeUtils工具类实现列表转树

 更新时间:2022年11月22日 11:34:57   作者:赛先生和泰先生  
在开发过程中,总有列表转树的需求,几乎是项目的标配,有没有一种通用且跨项目的解决方式呢?本文将基于Java8的Lambda 表达式和Stream等知识,使用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": []
        }
      ]
    }
  ]
}

三、小结

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

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

到此这篇关于Java利用TreeUtils工具类实现列表转树的文章就介绍到这了,更多相关Java TreeUtils列表转树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一道关于java异常处理的题目

    一道关于java异常处理的题目

    本文给大家分享一道关于java异常处理的题目,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 深入浅析java中flyway使用简介

    深入浅析java中flyway使用简介

    Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。这篇文章主要介绍了flyway使用简介,需要的朋友可以参考下
    2020-07-07
  • java使用HttpSession实现QQ访问记录

    java使用HttpSession实现QQ访问记录

    这篇文章主要介绍了java使用HttpSession实现QQ的访问记录的相关资料,需要的朋友可以参考下
    2016-03-03
  • Java实现快速排序算法的完整示例

    Java实现快速排序算法的完整示例

    这篇文章主要给大家介绍了关于Java实现快速排序算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • springboot 多环境切换的方法

    springboot 多环境切换的方法

    这篇文章主要介绍了springboot 多环境切换的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java使用SFTP上传文件到服务器的简单使用

    Java使用SFTP上传文件到服务器的简单使用

    这篇文章主要介绍了Java使用SFTP上传文件到服务器的简单使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • 解析Spring Cloud Bus消息总线

    解析Spring Cloud Bus消息总线

    这篇文章主要介绍了Spring Cloud Bus消息总线的介绍及使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 解析Spring Mvc Long类型精度丢失问题

    解析Spring Mvc Long类型精度丢失问题

    在平时开发过程中,经常会使用long类型作为id的类型,但是在使用过程中会导致long类型数据转换为number类型时的后两位变为0,今天小编给大家分享Spring Mvc Long类型精度丢失问题,需要的朋友参考下吧
    2021-06-06
  • maven多模块工程打包部署的方法步骤

    maven多模块工程打包部署的方法步骤

    本篇文章主要介绍了maven多模块工程打包部署的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java 基础之内部类详解及实例

    Java 基础之内部类详解及实例

    这篇文章主要介绍了 Java 基础之内部类详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论