Hutool工具类之树结构工具

1,584 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

Hutool工具类之树结构工具

Hutool是一个小而全的Java工具包, 包含了各种各样的使用的工具 详细文档参考

引入依赖参考

引入依赖

maven引入的几种方式

  • 直接引入全部包(懒人必备)
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.2</version>
</dependency>
  • 只引入指定模块(如我们这里使用树结构工具只需要引入core)
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>5.8.2</version>
</dependency>
  • 也支持hutool-bom模块, 提供dependencyManagement的包管理功能

构建菜单树结构

我们经常接触到菜单树结构, 之前都是用递归或者while循环的方式实现的, 现在我们可以使用Hutool的TreeUtil来尝试构造一颗菜单树

代码


/**
 * id
 */
private Integer id;
/**
 * 名称
 */
private String name;
/**
 * 父id
 */
private Integer parentId;
/**
 * 排序/权重
 */
private Integer sort;
/**
 * icon图标
 */
private String icon;
/**
 * 菜单路由
 */
private String route;


List<C> list = new ArrayList<>();
// 一级
list.add(new C(0, "顶级菜单-1", -1, 1,"ha","/menu1-0"));
list.add(new C(2, "二级菜单-1", 1, 3,"ha", "/menu1-2"));
list.add(new C(3, "三级菜单-1", 2, 4, "ha", "/menu1-3"));
list.add(new C(1, "一级菜单-1", 0, 2,"ha", "/menu1-1"));
// 三级
list.add(new C(11, "顶级菜单-3", -1, 10,"ha", "/menu3-0"));
list.add(new C(13, "二级菜单-3", 12, 12,"ha", "/menu3-2"));
list.add(new C(14, "三级菜单-3", 13, 13,"ha", "/menu3-3"));
list.add(new C(12, "一级菜单-3", 11, 11,"ha", "/menu3-1"));
// 二级
list.add(new C(20, "顶级菜单-2", -1, 5,"ha", "/menu2-0"));
list.add(new C(24, "二级菜单-2-1", 21, 7,"ha", "/menu2-2-1"));
list.add(new C(22, "二级菜单-2-2", 21, 8,"ha", "/menu2-2-2"));
list.add(new C(23, "三级菜单-2", 22, 9,"ha", "/menu2-3"));
list.add(new C(21, "一级菜单-2", 20, 6,"ha", "/menu2-1"));
List<TreeNode<Integer>> nodeList = new ArrayList<>();
list.forEach(e -> {
    // 构建一个树节点, id, 父id, 名称, 权重
    TreeNode<Integer> treeNode = new TreeNode<>(e.getId(), e.getParentId(), e.getName(), e.getSort());
    // 添加扩展字段
    Map<String, Object> extraMap = new HashMap<>();
    extraMap.put("icon", e.getIcon());
    extraMap.put("route", e.getRoute());
    treeNode.setExtra(extraMap);
    nodeList.add(treeNode);
});
// 加入配置, 配置相关字段的映射名
TreeNodeConfig treeNodeConfig = new TreeNodeConfig() {{
    setWeightKey("sort");
}};
// 将树节点转化为树
List<Tree<Integer>> build = TreeUtil.build(nodeList, -1, treeNodeConfig, new DefaultNodeParser<>());
System.out.println(JSON.toJSONString(build));

可以看到我故意打乱了插入顺序, 通过TreeUtil构建了一颗复杂的菜单树, 最终实现了想要树结构效果 1654755889507.jpg

如果需要按树结构从上到下的所有树节点数据, 可以简单实现

private static void flatTree(List<C> list, List<Tree<Integer>> build) {
    for (Tree<Integer> tree : build) {
        list.add(BeanUtil.copyProperties(tree, C.class));
        if (CollUtil.isNotEmpty(tree.getChildren())) {
            flatTree(list, tree.getChildren());
        }
    }
}

image.png