(1)给实体类添加字段,用来封装子菜单,@TableField(exist = false)不映射数据库字段
@TableField(exist = false)
private List<CategoryEntity> children;
(2)查出一级菜单,使用过滤器,筛选条件为父Id=0
(3)从一级菜单开始一级一级向下查找子菜单,
(4)查出全部菜单的父id=一级菜单id,就可筛选出一级菜单的子类,然后递归查一级菜单的子类的子类,最后返回一级菜单子类
(5)升序排序,使用比较器comparator比较,传入两个参数a,比较,当a<b返回-1,a==b返回0,a>b返回1
//比较流元素,Stream<T> sorted(Comparator<? super T> comparator);
sorted((menu1, menu2) -> {
return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
})
-
Stream流filter()与map()的区别
需要转换list集合时使用steam流,只需要取list集合中的元素使用增强for即可
filter是筛选集合,map是对集合的元素进行转换
filter返回符合boolean类型的元素,map返回处理完成的集合
例:
filter() [a1,a2,a3] -> [a1]
map() [a1,a2,a3] -> [1,2,3]
/**
* 查询所以分类以及子分类,并按树状结构分组
* @return durunwu
*/
@Override
public List<CategoryEntity> queryListToTree() {
List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
List<CategoryEntity> level1Menu = categoryEntities.stream()
.filter(data -> data.getParentCid() == 0)
.map(menu -> {//menu: 上面筛选出的一级菜单
//getChildCategoryEntity(父类,全部菜单), 全部菜单的父id=父类id,就可筛选出父类的子类
menu.setChildren(getChildCategoryEntity(menu,categoryEntities));
return menu;
}).sorted((menu1, menu2) -> {//上一步返回的menu是一级菜单,所以下面是给一级菜单排序
return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
}).collect(Collectors.toList());
return level1Menu;
}
/**
* 获取当前菜单的子菜单,并按升序排序
* @param menu 当前菜单
* @param categoryEntities 所有菜单
* @return List<CategoryEntity>
*/
public List<CategoryEntity> getChildCategoryEntity(CategoryEntity menu,List<CategoryEntity> categoryEntities){
List<CategoryEntity> entities = categoryEntities.stream().filter(entity -> {
//返回所有类中父类id等于menu 分类id的类,证明此类为menu类的子类
return entity.getParentCid().equals(menu.getCatId());
}).map(entity -> {//entity:上面查出的子类
//递归取子菜单
entity.setChildren(getChildCategoryEntity(entity,categoryEntities));
return entity;
}).sorted((menu1, menu2) -> {
return (menu1.getCatLevel()==null?0:menu1.getCatLevel()) - (menu2.getCatLevel()==null?0:menu2.getCatLevel());
}).collect(Collectors.toList());
return entities;
}