认识hutool包TreeUtil工具类使用

1,297 阅读3分钟

一、演示TreeUtil工具类使用

package com.core.treenode.demo.temp.hutTreeNode;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * Hutool树结构操作工具类示例,主要演示使用TreeUtil构建树状结构数据并进行相关配置及处理。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HutoolTreeUtilClothDemo {
    private Integer id;
    private String name;
    private Integer pid;
    private String desc;
    private Integer sort;
    // 子目录列表
    private List<HutoolTreeUtilClothDemo> treeNode;

    /**
     * 构建树状结构数据并转换为JSON字符串输出的主函数,用于演示如何使用Hutool的TreeUtil工具类将扁平化数据转换为树状结构,
     * 同时配置返回数据的格式,并对节点进行额外属性设置和排序处理。
     *
     * @param args 命令行参数,在此示例中未使用
     */
    public static void main(String[] args) {
        try {
            // 构建数据【层叠数据】,模拟原始的扁平化数据列表,后续将基于此构建树状结构
            List<HutoolTreeUtilClothDemo> lists = CollUtil.newArrayList();
            lists.add(new HutoolTreeUtilClothDemo(1, "顶级目录1", 0, "顶级目录", 0, null));
            lists.add(new HutoolTreeUtilClothDemo(2, "一级目录1", 1, "父目录01", 1, null));
            lists.add(new HutoolTreeUtilClothDemo(3, "一级目录2", 1, "父目录01", 3, null));
            lists.add(new HutoolTreeUtilClothDemo(4, "一级目录3", 1, "父目录01", 2, null));

            System.out.println("【原始数据】JSON.toJSONString(lists) = " + JSON.toJSONString(lists));
            // 配置返回JSON数据【类似取别名】,设置返回树状结构数据中节点的关键属性名称
            TreeNodeConfig config = new TreeNodeConfig();
            config.setIdKey("id_rest");
            config.setNameKey("name_rest");
            // 定义根节点值,用于确定树状结构的起始节点
            String rootId = "0";
            List<Tree<String>> list = buildTreeAndProcessNodes(lists, rootId, config);
            System.out.println("【处理完成】JSON.toJSONString(list) = " + JSON.toJSONString(list));
        } catch (Exception e) {
            // 捕获任何可能出现的异常,并打印异常信息,便于调试和排查问题
            System.err.println("在构建树状结构或处理过程中出现异常: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 使用Hutool的TreeUtil工具类构建树状结构数据,配置节点属性名称,并对节点进行额外属性设置和排序处理。
     *
     * @param dataList  数据源,即需要构建树状数据的原始扁平化数据列表,列表元素为HutoolTreeUtilClothDemo类型
     * @param rootNodeId 根节点值,用于在原始数据中确定树状结构的起始节点,类型为String
     * @param config    配置返回数据格式的对象,用于设置树状结构中节点的关键属性在JSON输出中的名称
     * @return 构建好并经过处理的树状结构数据列表,每个元素表示树中的一个节点,以Tree<String>类型存储
     */
    private static List<Tree<String>> buildTreeAndProcessNodes(List<HutoolTreeUtilClothDemo> dataList, String rootNodeId, TreeNodeConfig config) {
        return TreeUtil.build(dataList, rootNodeId, config, (node, tree) -> {
            tree.setId(node.getId().toString());
            tree.setName(node.getName());
            tree.setParentId(node.getPid().toString());
            // 根据该字段排序,正序排列,数字越小越靠前
            tree.setWeight(node.getSort());
            // 额外的值【参与构建树的属性其实只包含: id、parentId】
            tree.put("desc", node.getDesc());
            tree.put("sort", node.getSort());
            // 移除返回语句,因为NodeParser接口的实现应该是void类型,不返回值
        });
    }
}

二、数据:

1、原始数据

[
  {
    "desc": "顶级目录",
    "id": 1,
    "name": "顶级目录1",
    "pid": 0,
    "sort": 0
  },
  {
    "desc": "父目录01",
    "id": 2,
    "name": "一级目录1",
    "pid": 1,
    "sort": 1
  },
  {
    "desc": "父目录01",
    "id": 3,
    "name": "一级目录2",
    "pid": 1,
    "sort": 3
  },
  {
    "desc": "父目录01",
    "id": 4,
    "name": "一级目录3",
    "pid": 1,
    "sort": 2
  }
]

2、处理完成数据

[
  {
    "id_rest": "1",
    "name_rest": "顶级目录1",
    "parentId": "0",
    "weight": 0,
    "desc": "顶级目录",
    "sort": 0,
    "children": [
      {
        "id_rest": "2",
        "name_rest": "一级目录1",
        "parentId": "1",
        "weight": 1,
        "desc": "父目录01",
        "sort": 1
      },
      {
        "id_rest": "4",
        "name_rest": "一级目录3",
        "parentId": "1",
        "weight": 2,
        "desc": "父目录01",
        "sort": 2
      },
      {
        "id_rest": "3",
        "name_rest": "一级目录2",
        "parentId": "1",
        "weight": 3,
        "desc": "父目录01",
        "sort": 3
      }
    ]
  }
]