Java返回树形结构数据

classes:为我的实体类,请替换为你的实体类,并确保其中有parentId字段和childrenList,确保父节点的parentId为0也就是最顶级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 /**
* 获取并构建Classes对象的树形结构列表。
*
* @param classes 用于筛选的Classes对象,可以包含查询条件。
* @return 包含顶级Classes对象及其子节点的列表。
*/
public List<Classes> getChildrenList(Classes classes) {
// 从数据库中查询所有符合条件的Classes对象
List<Classes> treeList = Optional.ofNullable(groupMealOrdersMapper.selectClassesList(classes))
.orElse(Collections.emptyList());

if (treeList.isEmpty()) {
return Collections.emptyList(); // 如果没有数据,直接返回空列表
}

// 构建子节点映射
Map<Long, List<Classes>> childrenMap = buildChildrenMap(treeList);

// 筛选出所有顶级节点(即 parentId 为 0 的 Classes 对象),并为它们设置子节点列表
List<Classes> topLevelNodes = treeList.stream()
.filter(item -> item.getParentId() == 0)
.peek(item -> item.setChildrenList(childrenMap.getOrDefault(item.getClassId(), Collections.emptyList())))
.collect(Collectors.toList());

// 递归填充子节点
fillChildren(topLevelNodes, childrenMap);

return topLevelNodes;
}

/**
* 构建子节点映射,将每个父节点ID与它的所有子节点列表关联起来。
*
* @param classesList 所有的Classes对象列表。
* @return 子节点映射。
*/
private Map<Long, List<Classes>> buildChildrenMap(List<Classes> classesList) {
return classesList.stream()
.collect(Collectors.groupingBy(Classes::getParentId));
}

/**
* 递归地为每个节点填充其子节点列表。
*
* @param nodes 要填充子节点的节点列表。
* @param childrenMap 子节点映射。
*/
private void fillChildren(List<Classes> nodes, Map<Long, List<Classes>> childrenMap) {
for (Classes node : nodes) {
List<Classes> children = node.getChildrenList();
if (children != null && !children.isEmpty()) {
for (Classes child : children) {
child.setChildrenList(childrenMap.getOrDefault(child.getClassId(), Collections.emptyList()));
fillChildren(child.getChildrenList(), childrenMap); // 递归填充子节点
}
}
}
}