1.固定层级的菜单
如三级菜单时
public List<Category> findCategory() {
//查询分类垂直列表
List<Category> categoryList = categoryMapper.findCategory();
/**
* 修改为树形分类
*/
//遍历得到一级分类
List<Category> categoriesFirst = categoryList.stream().filter(item ->item.getParentId().longValue() == 0).collect(Collectors.toList());
//遍历一级分类
if (!CollectionUtils.isEmpty(categoriesFirst)){
categoriesFirst.forEach(oneCategory ->{
//遍历二级分类,根据一级id对比二级父id
List<Category> categorySecond = categoryList.stream().filter(item ->item.getParentId().longValue() == oneCategory.getId() ).collect(Collectors.toList());
//把这个二级分类添加到一级父类中
oneCategory.setChildren(categorySecond);
//遍历三级分类
if (!CollectionUtils.isEmpty(categorySecond)){
categorySecond.forEach(twoCategory->{
//遍历三级菜单
List<Category> categoryThird = categoryList.stream().filter(item ->item.getParentId().longValue() == twoCategory.getId() ).collect(Collectors.toList());
twoCategory.setChildren(categoryThird);
});
}
});
}
return categoriesFirst;
}
2.未知层级的菜单
使用递归实现
(1)查询菜单
public List<SysMenu> findNodes() {
List<SysMenu> allMenu = sysMenuMapper.selectAll();
if (CollectionUtils.isEmpty(allMenu))return null;
List<SysMenu> sysMenus = MenuHelper.buildTree(allMenu);
return sysMenus;
}
(2)自定义工具类
public class MenuHelper {
/**
* 使用递归方法建菜单
* @param sysMenuList
* @return
*/
public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
List<SysMenu> trees = new ArrayList<>();
for (SysMenu sysMenu : sysMenuList) {
if (sysMenu.getParentId().longValue() == 0) {
trees.add(findChildren(sysMenu,sysMenuList));
}
}
return trees;
}
/**
* 递归查找子节点
* @param treeNodes
* @return
*/
public static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> treeNodes) {
sysMenu.setChildren(new ArrayList<SysMenu>());
for (SysMenu it : treeNodes) {
if(sysMenu.getId().longValue() == it.getParentId().longValue()) {
if (sysMenu.getChildren() == null) {
sysMenu.setChildren(new ArrayList<>());
}
sysMenu.getChildren().add(findChildren(it,treeNodes));
}
}
return sysMenu;
}
}
3.实体类
@Data
public class Category extends BaseEntity {
private String name;
private String imageUrl;
private Long parentId;
private Integer status;
private Integer orderNum;
private Boolean hasChildren;
private List<Category> children;
}