java递归获取树
当我们处理像部门树、菜单树等树形结构数据时,我们需要从后端获取一组扁平的数据列表。这些数据列表通常由一个父节点ID字段和一个当前节点ID字段组成,这样我们可以通过这两个字段建立节点之间的父子关系。然后,我们可以利用这些数据,通过递归的方式构建树形结构。
在Java后端中,我们可以通过递归函数来实现这一过程。首先,我们需要定义一个树节点类,该类包含节点的基本信息和一个子节点列表。然后,我们遍历扁平数据列表,对于每一个节点,我们将其加入到对应父节点的子节点列表中。如果当前节点没有子节点,我们可以直接将其加入到树的根节点列表中。然后,我们递归处理当前节点的子节点,直到所有节点都被加入到树中。
通过这种方式,我们可以将扁平的数据列表转换成树形结构,使得数据更加清晰和有序。这样,前端可以利用这棵树来构建下拉菜单等形式的界面,为用户提供更好的体验。代码如下
public static void main(String[] args) { // todo 业务数据 List<TreeVo> treeVoList = new ArrayList<>(); // 处理父节点为空的情况 treeVoList .stream() .filter(obj -> StringUtils.isBlank(obj.getPid())) .forEach(obj -> obj.setPid("-1")); // 根据父节点分组 Map<String, List<TreeVo>> treeCatch = treeVoList.stream() .collect(Collectors.groupingBy(TreeVo::getPid)); // 递归查询子节点,写入当前数据 treeVoList = findChildren(treeCatch, "-1"); // 打印 for (TreeVo treeVo : treeVoList) { System.out.println(JacksonUtil.bean2json(treeVo)); } } private static List<TreeVo> findChildren(Map<String, List<TreeVo>> treeCatch, String parentId) { List<TreeVo> children = treeCatch.getOrDefault(parentId, new ArrayList<>()); for (TreeVo treeVo : children) { List<TreeVo> subChildren = findChildren(treeCatch, treeVo.getId()); treeVo.getChildren().addAll(subChildren); } return children; } /** * 获取场地树RVO */ public class TreeVo { /** * ID */ private String id; /** * 名称 */ private String name; /** * 父ID */ private String pid; /** * 子级 */ private transient List<TreeVo> children; // 此处省略get\set }