携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
前言:
我们在开发生涯中总是会遇到需要写递归的需求,比如加载部门列表树,加载文件夹树。对于逻辑不好的同学写递归代码会要花很多时间,下面我们介绍一个解决写递归代码的工具类,真的是非常好用!
Hutool TreeUtil方法介绍
public static <T, E> List<Tree<E>> build(List<T> list, E parentId, NodeParser<T, E> nodeParser)
public static <E> List<Tree<E>> build(List<TreeNode<E>> list, E parentId)
public static <T, E> List<Tree<E>> build(List<T> list, E parentId, TreeNodeConfig treeNodeConfig, NodeParser<T, E> nodeParser)
public static List<Tree<Integer>> build(List<TreeNode<Integer>> list)
我们可以看到TreeUtil主要有四个build方法
-
第一个方法传入一个我们存放数据的集合,然后指定我们的parentId从哪里开始,再指定数据转换。
-
第二个方法需要我们将我们存放数据的容器先转换为TreeNode的集合,再指定parentId从哪里开始。
-
第三个方法是我们最常使用的方法指定我们存放数据的容器,然后指定parentId从哪里开始,然后指定我们的treeNode配置,最后一个参数为转化的函数
-
第四个方法是直接转换我们TreeNode的列表
代码示例
我们来看使用第三个方法的代码示例
@Data
public class Dept {
private Long id;
private Long parentId;
private String name;
}
public class TreeTest {
private static final List<Dept> deptList;
static {
Dept dept1 = new Dept(1l, 0l, "宣传部");
Dept dept2 = new Dept(2l, 0l, "财务部");
Dept dept3 = new Dept(3l, 0l, "采购部");
Dept dept4 = new Dept(4l, 1l, "宣传部子部门一");
Dept dept5 = new Dept(5l, 1l, "宣传部子部门二");
Dept dept6 = new Dept(6l, 1l, "宣传部子部门三");
Dept dept7 = new Dept(7l, 2l, "财务部子部门一");
Dept dept8 = new Dept(8l, 2l, "财务部子部门二");
Dept dept9 = new Dept(9l, 3l, "采购部子部门一");
Dept dept10 = new Dept(10l, 3l, "采购部子部门二");
deptList = Arrays.asList(dept1, dept2, dept3, dept4, dept5, dept6, dept7, dept8, dept9, dept10);
}
public static void main(String[] args) {
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
treeNodeConfig.setIdKey("id");
treeNodeConfig.setParentIdKey("parentId");
treeNodeConfig.setNameKey("name");
List<Tree<String>> treeList = TreeUtil.build(deptList, "0", treeNodeConfig, (map, tree) -> {
tree.setId(String.valueOf(map.getId()));
tree.setName(map.getName());
tree.setParentId(String.valueOf(map.getParentId()));
});
System.out.println(JSON.toJSON(treeList));
}
总结
上面的代码只要项目中引入了Hutool的jar就可以直接复制过去运行,大家遇到相似的需求可以先copy代码运行一下看下效果,然后使用Hutool的这个轮子来完成自己的需求。