一、树形节点类
自行引入lombok依赖
TreeNode
/** * @author ltb */ @Data public class TreeNode { private Long id; private Long parentId; private String name; private List<TreeNode> children; public TreeNode(long id, long parentId, String name) { this.id=id; this.parentId=parentId; this.name=name; } }
通过递归实现树的构建
步骤:
1.找到所有的根节点
2.根据每个根节点构建一个树形
3.合并所有根节点的树形
/** * @author ltb */ public class TreeBuild { public List<TreeNode> nodeList = new ArrayList<>(); /** * 构造方法 * @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。 */ public TreeBuild(List<TreeNode> nodeList){ this.nodeList = nodeList; } /** * 获取需构建的所有根节点 这里默认父节点值为"0"作为根节点 * @return 所有根节点List集合 */ public List<TreeNode> getRootNode(){ // rootNodeList 保存所有根节点(所有根节点的数据) // treeNode:查询出的每一条数据(节点) List<TreeNode> rootNodeList = nodeList.stream().filter(i->i.getParentId()==0).collect(Collectors.toList()); return rootNodeList; } /** * 根据所有根节点进行构建树形结构 * @return 构建整棵树 */ public List<TreeNode> buildTree(){ // treeNodes:保存一个顶级节点所构建出来的完整树形 // getRootNode():获取所有的根节点 List<TreeNode> treeNodes = getRootNode().stream() .map(this::buildChildTree) .collect(Collectors.toList()); return treeNodes; } /** * 递归-----构建单个子树形结构 * @param pNode 根节点 * @return 整棵树 */ public TreeNode buildChildTree(TreeNode pNode){ List<TreeNode> childTree = new ArrayList<TreeNode>(); // nodeList:所有节点集合(所有数据) nodeList.stream() .filter(i-> i.getParentId().equals(pNode.getId())) .forEach(i -> childTree.add(buildChildTree(i))); // 处理数据结束,即节点下没有任何节点,树形构建结束,设置树结果 pNode.setChildren(childTree); return pNode; } }
二、完全通过Steam流两行代码实现
思路:
1.通过 Collectors.groupingBy() 将父id分组
2.通过foreach 循环为原有节点设置子节点 并映射到map
完整
TreeController@RestController @RequestMapping("/tree") public class TreeController { @GetMapping("/treeTest") public List<TreeNode> treeTest(){ //模拟数据 List<TreeNode> treeNodeList = new ArrayList<>(); treeNodeList.add(new TreeNode(1,0,"根节点1")); treeNodeList.add(new TreeNode(2,0,"根节点2")); treeNodeList.add(new TreeNode(3,1,"父节点是1")); treeNodeList.add(new TreeNode(4,2,"父节点是2")); treeNodeList.add(new TreeNode(5,2,"父节点是2")); treeNodeList.add(new TreeNode(6,3,"父节点是3")); TreeBuild treeBuild = new TreeBuild(treeNodeList); treeNodeList = treeBuild.buildTree(); return treeNodeList; } @GetMapping("/treeTest1") public List<TreeNode> treeTest1(){ //模拟数据 List<TreeNode> treeNodeList = new ArrayList<>(); treeNodeList.add(new TreeNode(1,0,"根节点1")); treeNodeList.add(new TreeNode(2,0,"根节点2")); treeNodeList.add(new TreeNode(3,1,"父节点是1")); treeNodeList.add(new TreeNode(4,2,"父节点是2")); treeNodeList.add(new TreeNode(5,2,"父节点是2")); treeNodeList.add(new TreeNode(6,3,"父节点是3")); Map<Long, List<TreeNode>> map = treeNodeList.stream().collect(Collectors.groupingBy(TreeNode::getParentId)); treeNodeList.forEach(i -> i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()))); return map.get(0L); } }
效果