摆脱掉烦人的递归代码之Hutool的TreeUtil

1,733 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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));
    }

json.jpg

总结

上面的代码只要项目中引入了Hutool的jar就可以直接复制过去运行,大家遇到相似的需求可以先copy代码运行一下看下效果,然后使用Hutool的这个轮子来完成自己的需求。