业务需求:返回一个tree结构,但是不知道根节点ID,所以需要一个工具实现多层级展示树结构的工具类
此方法依赖了hutool工具类包,也可以不用,但是需要自己转换父子关系结构。可以提出泛型类工具类此处只做演示,不细化工具类了就。
总体来说思想就是:
1.找出父节点
2.根据父节点的ID填充child数据,使父节点有child节点
- 先看方法实现:
//1.找出树的根节点
//2.给树赋值child
public static List<Tree<String>> fcMenuList(List<FcMenu> fcMenus) {
//1.找出树的根节点
List<FcMenu> roots = new ArrayList<>();
for (FcMenu fcMenu : fcMenus) {
boolean isChild = false;
for (FcMenu menu : fcMenus) {
if (fcMenu.getPid().equals(menu.getId())) {
isChild = true;
break;
}
}
if (!isChild) {
roots.add(fcMenu);
}
}
//2.给树赋值child
List<TreeNode<String>> collect = fcMenus.stream().map(menu -> {
TreeNode<String> treeNode = new TreeNode<>();
treeNode.setId(menu.getId());
treeNode.setParentId(menu.getPid());
treeNode.setName(menu.getName());
treeNode.setWeight(menu.getSort());
return treeNode;
}).collect(Collectors.toList());
List<Tree<String>> result = new ArrayList<>();
for (FcMenu root : roots) {
Tree<String> parentTree = new Tree<>();
parentTree.setId(root.getId());
parentTree.setParentId(root.getPid());
parentTree.setName(root.getName());
parentTree.setWeight(root.getSort());
result.add(parentTree);
List<Tree<String>> build = TreeUtil.build(collect, root.getId());
if (null != build) {
parentTree.setChildren(build);
}
}
return result;
}
- FcMenu 实体类
@Data
public class FcMenu {
private String id;
private String pid;
private String name;
private String sort;
}
- 测试Test方法
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import com.alibaba.fastjson.JSON;
import com.example.demo.entity.FcMenu;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class TreeDemoTest2 {
/**
* @author licl
*/
public static void main(String[] args) {
//就是构造树结构 自己add到集合里边去
List<FcMenu> fcMenus = dateList();
//结果打印
System.out.println(JSON.toJSONString(fcMenuList(fcMenus)));
}
/**
* 简单的构造tree结构
*/
private static List<FcMenu> dateList() {
String DEFAULT_PID = "-1";
List<FcMenu> fcMenus = new ArrayList<>();
FcMenu fcMenu1 = new FcMenu();
fcMenu1.setId("1");
fcMenu1.setPid("测试一下PID!~");
fcMenu1.setName("文章管理");
fcMenu1.setSort("1");
FcMenu fcMenu2 = new FcMenu();
fcMenu2.setId("2");
fcMenu2.setPid(fcMenu1.getId());
fcMenu2.setName("团队风采");
fcMenu2.setSort("1");
FcMenu fcMenu3 = new FcMenu();
fcMenu3.setId("3");
fcMenu3.setPid(fcMenu1.getId());
fcMenu3.setName("真心英雄");
fcMenu3.setSort("2");
FcMenu fcMenu4 = new FcMenu();
fcMenu4.setId("4");
fcMenu4.setPid(fcMenu1.getId());
fcMenu4.setName("大话西游");
fcMenu4.setSort("3");
FcMenu fcMenu5 = new FcMenu();
fcMenu5.setId("5");
fcMenu5.setPid(DEFAULT_PID);
fcMenu5.setName("活动管理");
fcMenu5.setSort("2");
FcMenu fcMenu6 = new FcMenu();
fcMenu6.setId("6");
fcMenu6.setPid(DEFAULT_PID);
fcMenu6.setName("草稿管理");
fcMenu6.setSort("3");
fcMenus.add(fcMenu1);
fcMenus.add(fcMenu2);
fcMenus.add(fcMenu3);
fcMenus.add(fcMenu4);
fcMenus.add(fcMenu5);
fcMenus.add(fcMenu6);
return fcMenus;
}
//1.找出树的根节点
//2.给树赋值child
public static List<Tree<String>> fcMenuList(List<FcMenu> fcMenus) {
//1.找出树的根节点
List<FcMenu> roots = new ArrayList<>();
for (FcMenu fcMenu : fcMenus) {
boolean isChild = false;
for (FcMenu menu : fcMenus) {
if (fcMenu.getPid().equals(menu.getId())) {
isChild = true;
break;
}
}
if (!isChild) {
roots.add(fcMenu);
}
}
//2.给树赋值child
List<TreeNode<String>> collect = fcMenus.stream().map(menu -> {
TreeNode<String> treeNode = new TreeNode<>();
treeNode.setId(menu.getId());
treeNode.setParentId(menu.getPid());
treeNode.setName(menu.getName());
treeNode.setWeight(menu.getSort());
return treeNode;
}).collect(Collectors.toList());
List<Tree<String>> result = new ArrayList<>();
for (FcMenu root : roots) {
Tree<String> parentTree = new Tree<>();
parentTree.setId(root.getId());
parentTree.setParentId(root.getPid());
parentTree.setName(root.getName());
parentTree.setWeight(root.getSort());
result.add(parentTree);
List<Tree<String>> build = TreeUtil.build(collect, root.getId());
if (null != build) {
parentTree.setChildren(build);
}
}
return result;
}
}
- 结果打印