持续创作,加速成长!这是我参与「掘金日新计划 · 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构建了一颗复杂的菜单树, 最终实现了想要树结构效果
如果需要按树结构从上到下的所有树节点数据, 可以简单实现
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());
}
}
}