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示例
















