用stream流和递归的方式,处理权限菜单List集合,并以parent和children的集合方式返回

1、首先从数据库的权限管理表中查出角色拥有的所有权限关联

2、然后通过信息中的id和parentId进行递归处理

private List<SystemNavigation> getNavigationTree(List<SystemPermissionNavigation> permissionNavigationNavigations){
        //取出导航目录id
        List<String> naviId = permissionNavigations.stream()
                .map(SystemPermissionNavigation::getNaviId)
                .collect(Collectors.toList());
        //查询菜单导航
        SystemNavigationExample systemNavigationExample = new SystemNavigationExample();
        systemNavigationExample.setOrderByClause("sort_id ASC");
        systemNavigationExample.createCriteria()
                .andIdIn(naviId);
        List<SystemNavigation> navigations =                                         
        systemNavigationMapper.selectByExample(systemNavigationExample);
        List<SystemNavigation> menuList = navigations.stream()
                .filter(nav -> nav.getParentd() == null)  // 根据条件筛选出一级目录(parentId 为 null)
                .map(nav -> setSubNavigations(nav, navigations))  // 使用 map 方法设置每个一级目录的二级菜单信息
                .collect(Collectors.toList());
        return menuList;
}

private static SystemNavigation setSubNavigations(SystemNavigation nav, List<SystemNavigation> navigtions) {
    List<SystemNavigation> subNavigations = navigations.stream()
                .filter(subNav -> subNav.getParentId() != null &&         
                    subNav.getParentId().equals(nav.getId()))  // 根据条件筛选出对应的二级菜单的子菜单信息
                .collect(Collectors.toList());
    nav.setChildren(subNavigations);
        return nav;
}
          

public class SystemNavigation {
    private String id;

    private String parentId;
    
    private List<SystemNavigation> children;

    /*****其他属性参数*******/
}

3、最后得出的结果是:有几级菜单,就会有几层List<SystemNavigation> children;

要实现Java递归处理权限管理菜单树或分类,可以按照以下步骤: 1. 定义一个权限类,包含权限ID、权限名称、父级权限ID等属性。 2. 定义一个菜单类或分类类,包含菜单ID、菜单名称、父级菜单ID等属性,以及一个权限对象作为属性,表示该菜单或分类所对应的权限。 3. 将菜单或分类数据存储在数据库中,每个菜单或分类对应一条记录。 4. 在Java程序中,定义一个递归方法,用于遍历菜单或分类树,并将每个节点对应的权限赋值给该节点对应的菜单或分类对象。 5. 在递归方法中,首先查询当前节点对应的权限对象,然后将其赋值给当前节点对应的菜单或分类对象。 6. 然后递归遍历当前节点的子节点,将子节点对应的权限对象也赋值给子节点对应的菜单或分类对象。 7. 最后返回当前节点对应的菜单或分类对象。 以下是一个示例代码: ``` public class Permission { private int id; private String name; private int parentId; // 省略getter和setter方法 } public class Menu { private int id; private String name; private int parentId; private Permission permission; // 省略getter和setter方法 } public class Category { private int id; private String name; private int parentId; private Permission permission; // 省略getter和setter方法 } public class PermissionService { public List<Menu> getMenuTree() { // 查询所有菜单数据 List<Menu> menus = menuDao.getAllMenus(); // 遍历菜单树,递归赋值权限对象 for (Menu menu : menus) { setPermission(menu); } // 返回菜单树 return buildMenuTree(menus); } public List<Category> getCategoryTree() { // 查询所有分类数据 List<Category> categories = categoryDao.getAllCategories(); // 遍历分类树,递归赋值权限对象 for (Category category : categories) { setPermission(category); } // 返回分类树 return buildCategoryTree(categories); } private void setPermission(Menu menu) { // 查询当前菜单对应的权限对象 Permission permission = permissionDao.getPermissionById(menu.getPermissionId()); // 将权限对象赋值给菜单对象 menu.setPermission(permission); // 递归遍历子菜单 List<Menu> children = menuDao.getMenusByParentId(menu.getId()); for (Menu child : children) { setPermission(child); } } private void setPermission(Category category) { // 查询当前分类对应的权限对象 Permission permission = permissionDao.getPermissionById(category.getPermissionId()); // 将权限对象赋值给分类对象 category.setPermission(permission); // 递归遍历子分类 List<Category> children = categoryDao.getCategoriesByParentId(category.getId()); for (Category child : children) { setPermission(child); } } private List<Menu> buildMenuTree(List<Menu> menus) { // 构建菜单树 // 省略代码 } private List<Category> buildCategoryTree(List<Category> categories) { // 构建分类树 // 省略代码 } } ``` 在以上代码中,递归方法setPermission()用于遍历菜单或分类树,并将每个节点对应的权限对象赋值给该节点对应的菜单或分类对象。buildMenuTree()和buildCategoryTree()方法用于构建菜单树和分类树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值