树状结构
返回菜单数据需要体现父子菜单的层级关系
1.查询当前用户下的所有菜单数据
@Override
public List<Menu> selectRouterMenuTreeByUserId(Long id) {
return buildMenuTree(menuMapper.selectRouterMenuTreeByUserId(id),0L);
}
2.构建树结构,先过滤出第一层菜单,向第一层菜单里添加子菜单
private List<Menu> buildMenuTree(List<Menu> menus,Long parentId) {
//先找出第一层的菜单,然后将子菜单设置到children属性中
List<Menu> menuTree = menus.stream()
//过滤出所有菜单里是第一层的菜单,parentId=0L
.filter(menu -> menu.getParentId().equals(parentId))
//向当前菜单里添加子菜单
.map(menu -> menu.setChildren(getChildren(menu, menus)))
.collect(Collectors.toList());
return menuTree;
}
3.获取当前菜单的子菜单集合
private List<Menu> getChildren(Menu menu, List<Menu> menus) {
List<Menu> childrenList = menus.stream()
.filter(m -> m.getParentId().equals(menu.getId()))
//子菜单的下一级(第三层一般很少用)
.map(m->m.setChildren(getChildren(m,menus)))
.collect(Collectors.toList());
return childrenList;
}