树节点配置-TreeNodeConfig
# 🎯 简介
TreeNodeConfig 是 Hutool 树结构模块中的配置类,用于自定义树节点的各种属性名称和递归深度。通过该类,用户可以灵活配置树节点的字段名,以适应不同的业务场景和数据结构。
# 📋 核心特性
- ✅ 支持自定义ID字段名
- ✅ 支持自定义父节点ID字段名
- ✅ 支持自定义权重字段名
- ✅ 支持自定义名称字段名
- ✅ 支持自定义子节点集合字段名
- ✅ 支持配置递归深度
- ✅ 提供默认配置对象
- ✅ 支持链式调用
- ✅ 实现了序列化接口
# 🛠️ 类结构
typedef TreeNodeConfig
├── 常量
│ └── DEFAULT_CONFIG: TreeNodeConfig // 默认配置对象
├── 属性
│ ├── idKey: String // ID字段名,默认"id"
│ ├── parentIdKey: String // 父节点ID字段名,默认"parentId"
│ ├── weightKey: String // 权重字段名,默认"selector"
│ ├── nameKey: String // 名称字段名,默认"name"
│ ├── childrenKey: String // 子节点集合字段名,默认"children"
│ └── deep: Integer // 递归深度,默认null(不限制)
└── 方法
├── getIdKey(): String // 获取ID字段名
├── setIdKey(idKey): TreeNodeConfig // 设置ID字段名(链式)
├── getParentIdKey(): String // 获取父节点ID字段名
├── setParentIdKey(parentIdKey): TreeNodeConfig // 设置父节点ID字段名(链式)
├── getWeightKey(): String // 获取权重字段名
├── setWeightKey(weightKey): TreeNodeConfig // 设置权重字段名(链式)
├── getNameKey(): String // 获取名称字段名
├── setNameKey(nameKey): TreeNodeConfig // 设置名称字段名(链式)
├── getChildrenKey(): String // 获取子节点集合字段名
├── setChildrenKey(childrenKey): TreeNodeConfig // 设置子节点集合字段名(链式)
├── getDeep(): Integer // 获取递归深度
└── setDeep(deep): TreeNodeConfig // 设置递归深度(链式)
# 🚀 快速开始
# 基本使用
// 使用默认配置
TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG;
// 创建自定义配置
TreeNodeConfig customConfig = new TreeNodeConfig();
customConfig.setIdKey("nodeId")
.setParentIdKey("pid")
.setNameKey("nodeName")
.setChildrenKey("subNodes")
.setDeep(2); // 限制递归深度为2层
// 使用配置构建树
List<Map<String, Object>> tree = TreeUtil.build(nodeList, 0L, customConfig);
# 修改默认配置
// 创建并修改配置
TreeNodeConfig config = new TreeNodeConfig();
// 自定义字段名
config.setIdKey("uuid")
.setParentIdKey("parentUuid")
.setWeightKey("sort")
.setNameKey("title")
.setChildrenKey("items");
// 配置递归深度
config.setDeep(3); // 只构建3层树结构
Console.log("配置信息: {}", config);
# 📖 详细方法
# 获取默认配置
# DEFAULT_CONFIG
功能:获取默认配置对象
类型:静态常量
默认值:idKey="id", parentIdKey="parentId", weightKey="selector", nameKey="name", childrenKey="children", deep=null
使用场景:快速获取默认配置,无需手动设置
示例:
TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG;
# 属性访问方法
# getIdKey()
功能:获取ID字段名
返回值:ID字段名,默认"id"
示例:
String idKey = config.getIdKey();
# setIdKey(idKey)
功能:设置ID字段名
参数:
idKey- ID字段名返回值:当前配置实例,支持链式调用
使用场景:自定义树节点的ID字段名
示例:
config.setIdKey("nodeId");
# getParentIdKey()
功能:获取父节点ID字段名
返回值:父节点ID字段名,默认"parentId"
示例:
String parentIdKey = config.getParentIdKey();
# setParentIdKey(parentIdKey)
功能:设置父节点ID字段名
参数:
parentIdKey- 父节点ID字段名返回值:当前配置实例,支持链式调用
使用场景:自定义树节点的父节点ID字段名
示例:
config.setParentIdKey("pid");
# getWeightKey()
功能:获取权重字段名
返回值:权重字段名,默认"selector"
示例:
String weightKey = config.getWeightKey();
# setWeightKey(weightKey)
功能:设置权重字段名
参数:
weightKey- 权重字段名返回值:当前配置实例,支持链式调用
使用场景:自定义树节点的权重字段名
示例:
config.setWeightKey("sort");
# getNameKey()
功能:获取名称字段名
返回值:名称字段名,默认"name"
示例:
String nameKey = config.getNameKey();
# setNameKey(nameKey)
功能:设置名称字段名
参数:
nameKey- 名称字段名返回值:当前配置实例,支持链式调用
使用场景:自定义树节点的名称字段名
示例:
config.setNameKey("title");
# getChildrenKey()
功能:获取子节点集合字段名
返回值:子节点集合字段名,默认"children"
示例:
String childrenKey = config.getChildrenKey();
# setChildrenKey(childrenKey)
功能:设置子节点集合字段名
参数:
childrenKey- 子节点集合字段名返回值:当前配置实例,支持链式调用
使用场景:自定义树节点的子节点集合字段名
示例:
config.setChildrenKey("items");
# getDeep()
功能:获取递归深度
返回值:递归深度,默认null(不限制)
示例:
Integer deep = config.getDeep();
# setDeep(deep)
功能:设置递归深度
参数:
deep- 递归深度,从0开始计算返回值:当前配置实例,支持链式调用
使用场景:限制树的递归深度,避免无限递归
示例:
config.setDeep(2); // 只构建2层树结构
# 🎨 使用场景
# 1. 自定义字段名
// 创建配置
TreeNodeConfig config = new TreeNodeConfig();
// 自定义字段名以匹配前端需求
config.setIdKey("key")
.setParentIdKey("parentKey")
.setNameKey("label")
.setChildrenKey("value")
.setWeightKey("order");
// 构建树
List<Map<String, Object>> tree = TreeUtil.build(nodeList, "0", config);
// 输出树结构
Console.log("自定义字段名树: {}", tree);
# 2. 限制递归深度
// 创建配置并限制递归深度
TreeNodeConfig config = new TreeNodeConfig();
config.setDeep(1); // 只构建1层树结构
// 假设nodeList有多层嵌套关系
List<Map<String, Object>> tree = TreeUtil.build(nodeList, 0L, config);
// 输出结果将只包含根节点和直接子节点
Console.log("限制深度的树: {}", tree);
# 3. 适配不同数据源
// 适配数据库查询结果
TreeNodeConfig config = new TreeNodeConfig();
config.setIdKey("category_id")
.setParentIdKey("parent_category_id")
.setNameKey("category_name")
.setWeightKey("display_order")
.setChildrenKey("sub_categories");
// 从数据库获取数据
List<Category> categories = categoryDao.findAll();
// 构建树
List<Map<String, Object>> categoryTree = TreeUtil.build(categories, "0", config);
Console.log("分类树: {}", categoryTree);
# 💡 注意事项
- 默认配置:
DEFAULT_CONFIG是一个静态常量,修改它会影响所有使用默认配置的地方 - 递归深度:
deep从0开始计算,0表示只有根节点- 设置为null表示不限制深度
- 建议在处理大量数据时设置合理的深度,避免内存溢出
- 字段名冲突:自定义字段名时,应避免与业务数据中的字段名冲突
- 权重字段名:默认权重字段名为"selector",可能与实际业务不符,建议根据需求修改
- 链式调用:所有setter方法都返回当前实例,支持链式调用
- 序列化:实现了Serializable接口,可以用于网络传输和持久化
# 🚀 性能优化
- 对于大量数据,建议设置合理的递归深度,避免构建过深的树结构
- 优先使用默认配置,减少对象创建开销
- 对于固定配置,建议将配置对象缓存起来,避免重复创建
# 🔍 最佳实践
- 配置复用:对于相同业务场景的树结构,建议复用同一个配置对象
- 字段名规范:根据业务需求和前端要求,合理命名字段名
- 深度控制:根据数据量和业务需求,合理设置递归深度
- 默认配置扩展:基于默认配置进行修改,减少重复代码
- 注释说明:对配置进行注释,说明各字段的用途和取值
# 📝 总结
TreeNodeConfig 是 Hutool 树结构模块中的重要配置类,提供了灵活的字段名和递归深度配置选项。通过该类,用户可以根据不同的业务场景和数据结构,自定义树节点的各种属性名称,从而生成符合需求的树结构。
无论是适配前端组件的字段要求,还是处理不同数据源的字段差异,TreeNodeConfig 都能提供灵活的解决方案。同时,通过设置递归深度,可以有效控制树的复杂度,提高性能并避免内存溢出。
在实际开发中,建议根据具体业务需求,合理配置字段名和递归深度,以获得最佳的使用效果。