0%

Java 实现树形数据查询

一般情况下,我们可以通过 SQL 的方式和 Java 的方式获取树形数据,比如常见的菜单数据、用户组织数据等。下面我们使用 Java 的 Stream 类处理获取树形数据。

下图是对应的数据模型,我们主要需要关注的就是分类标识 cat_id、父分类标识 parent_cid 和排序字段 sort。

数据模型

如下是对应的代码,具体分析见注释:

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
/**
* 树形查询分类列表数据
* @return
*/
@Override
public List<CategoryEntity> listWithTree() {
// 1. 查询所有分类数据
List<CategoryEntity> entities = baseMapper.selectList(null);

// 2. 过滤获取所有父分类
List<CategoryEntity> collect = entities.stream().filter(
e -> e.getParentCid() == 0
).map(e -> {
// 3. 设置每个父分类的子分类
e.setChildren(getChildren(e, entities));
return e;
// 4. 对所有父分类进行升序排序
}).sorted((e1, e2) -> (e1.getSort() == null ? 0 : e1.getSort()) - (e2.getSort() == null ? 0 : e2.getSort())).collect(Collectors.toList());
return collect;
}

/**
* 递归设置父分类的所有子分类
* @param curMenu 当前菜单分类实体
* @param allMenus 所有菜单分类列表
* @return
*/
private List<CategoryEntity> getChildren(CategoryEntity curMenu, List<CategoryEntity> allMenus) {
// 1. 过滤获取当前父分类的所有子分类
List<CategoryEntity> entities = allMenus.stream().filter(e ->
curMenu.getCatId().equals(e.getParentCid())
).map(e -> {
// 2. 设置当前父分类的所有子分类
e.setChildren(getChildren(e, allMenus));
return e;
// 3. 对所有父分类进行升序排序
}).sorted((e1, e2) -> (e1.getSort() == null ? 0 : e1.getSort()) - (e2.getSort() == null ? 0 : e2.getSort())).collect(Collectors.toList());
return entities;
}

下图是对应的数据返回结果:

查询结果

------ 本文结束------