Hutool 是一个 Java 工具库,其中包含了丰富的功能模块,尤其是在数据结构和工具类方面非常强大。本文将重点介绍 Hutool 中的 TreeUtil
类,演示如何快速构建树形结构,并讨论数据排序的问题。在实际应用中,树形结构常用于组织层级数据,例如菜单、部门、商品分类等场景。
TreeUtil 的基本用法
Hutool 的 TreeUtil
提供了构建树形结构的方便方法,主要有两种方式:线性结构转换为树形结构,以及根据指定的属性构建树。
第一种方式:线性结构转换为树形结构
假设我们有一组简单的部门数据,每个部门有一个 ID 和一个父级部门 ID。我们可以利用 TreeUtil.build()
方法将其转换为树形结构。
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeUtil;
import java.util.ArrayList;
import java.util.List;
class Department {
private Long id;
private Long parentId;
private String name;
// 省略构造函数、getter 和 setter
}
public class TreeExample {
public static void main(String[] args) {
List<Department> departments = new ArrayList<>();
departments.add(new Department(1L, 0L, "总公司"));
departments.add(new Department(2L, 1L, "技术部"));
departments.add(new Department(3L, 1L, "销售部"));
departments.add(new Department(4L, 2L, "研发团队"));
departments.add(new Department(5L, 2L, "测试团队"));
List<Tree<Long>> treeList = TreeUtil.build(departments, 0L, (department) -> {
Tree<Long> tree = new Tree<>();
tree.setId(department.getId());
tree.setParentId(department.getParentId());
tree.setName(department.getName());
return tree;
});
// 输出树形结构
System.out.println(treeList);
}
}
在上述代码中,我们定义了一个 Department
类,表示一个部门的基本信息。然后,我们使用 TreeUtil.build
方法将部门数据转换为树形结构。在构建树的时候,我们传入了一个 Lambda 表达式,以指定如何将 Department
转换为 Tree
对象。
第二种方式:根据指定属性构建树
除了简单转换,Hutool 还支持根据特定的属性构建树形结构。例如,我们可以使用更复杂的数据结构来组织树的层级关系。
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeUtil;
import java.util.Arrays;
import java.util.List;
public class TreeExampleAdvanced {
public static void main(String[] args) {
List<TreeNode> nodes = Arrays.asList(
new TreeNode(1L, 0L, "根节点"),
new TreeNode(2L, 1L, "子节点1"),
new TreeNode(3L, 1L, "子节点2"),
new TreeNode(4L, 2L, "子子节点1"),
new TreeNode(5L, 2L, "子子节点2")
);
List<Tree<Long>> treeList = TreeUtil.build(nodes, 0L, (node) -> {
Tree<Long> tree = new Tree<>();
tree.setId(node.getId());
tree.setParentId(node.getParentId());
tree.setName(node.getName());
return tree;
});
// 遍历树形结构
for (Tree<Long> tree : treeList) {
System.out.println(tree.getName());
}
}
}
class TreeNode {
private Long id;
private Long parentId;
private String name;
// 省略构造函数、getter 和 setter
}
在这个例子中,我们定义了一个 TreeNode
类并构建了一个节点列表。然后,类似于上一个例子,我们使用 TreeUtil.build
方法将其转换为树形结构。代码中的 Lambda 表达式则用于生成树的节点。
数据排序
在实际应用中,可能需要对树形结构进行排序。Hutool 提供的 TreeUtil
默认是无法直接排序的,但我们可以在构建树的过程中,对节点进行排序。可以使用 Java 8 的流式 API 来进行数据排序。例如:
import java.util.Comparator;
List<TreeNode> sortedNodes = nodes.stream()
.sorted(Comparator.comparing(TreeNode::getName))
.collect(Collectors.toList());
通过这种方式,我们可以根据节点的名称对数据进行排序,然后再用 TreeUtil
进行树形结构的构建。
小结
Hutool 的 TreeUtil
类为构建树形结构提供了方便的 API,能够快速将线性结构转换成树形结构。结合 Java 的流处理能力,我们可以实现对数据的灵活排序。树形结构在实际开发中有着广泛的应用,掌握 TreeUtil
的使用,能够帮助我们更高效地处理这类问题。