1     // 查询树形结构节点
 2     public List<CategoryEntity> listWithTree() {
 3         // 查出所有节点
 4         List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
 5         // 组装父子树形结构
 6         return categoryEntities.stream()
 7                 // 获取一级节点
 8                 .filter(categoryEntity -> categoryEntity.getParentCid() == 0L)
 9                 // 插入子节点到children属性
10                 .peek(menu -> menu.setChildren(getChildren(menu, categoryEntities)))
11                 // 根据sort属性排序(空值居后)
12                 .sorted(Comparator.nullsLast(Comparator.comparingInt(CategoryEntity::getSort)))
13                 // 将流数据转成List类型
14                 .collect(Collectors.toList());
15     }
16     // 根据全部节点,获取当前节点的子节点
17     private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> all) {
18         return all.stream()
19                 // 获取当前节点的子节点
20                 .filter(menu -> root.getCatId().equals(menu.getParentCid()))
21                 // 递归调用,查找子节点插入至children属性
22                 .peek(categoryEntity -> categoryEntity.setChildren(getChildren(categoryEntity, all)))
23                 // 对子节点根据sort属性排序(空值居后)
24                 .sorted(Comparator.nullsLast(Comparator.comparingInt(CategoryEntity::getSort)))
25                 // 将流数据转成List类型
26                 .collect(Collectors.toList());
27     }

示例:将获取的通过parentCid关联的节点list转为树形结构。

CategoryEntity相关属性介绍children(数据库不存在的属性,用来放入子节点)parentCid(父节点id)、sort(排序序号)。

一、查询所有的节点;

二、查询所有的一级节点,根据categoryEntity -> categoryEntity.getParentCid() == 0L ;

三、查询所有子节点放入children属性,getChilren与获取一级节点类似,使用了递归调用;

四、对同级进行排序,利用comparingInt将Integer类型从小到大进行排序,并利用nullsLast规避空指针异常并将null值序号节点放置在最后;

五、将转为list;

 

—— Java1.8示例