IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java8新特性 非常简单的递归查询所有子节点树 -> 正文阅读

[Java知识库]java8新特性 非常简单的递归查询所有子节点树

在开发中很多同学都遇到过遍历 查询所有子节点的业务,在这里给大家分析 使用java8的语法 很简单的递归来实现

我就拿一个最普遍的 菜单遍历案例分享给大家

一、首先看看我的菜单表结构

其中我添加了一点数据来测试

?可以看到我所有菜单的父级都是 系统管理(自己也可以添加不同的父子级关系)

二、 Java8递归遍历

1、菜单的实体类

@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="SysMenu对象", description="")
public class SysMenu implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "ID")
    @TableId(value = "menu_id", type = IdType.AUTO)
    private Integer menuId;

    @ApiModelProperty(value = "父ID")
    private Integer parentId;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "路径")
    private String component;

    @ApiModelProperty(value = "路由")
    private String path;

    @ApiModelProperty(value = "等级")
    private Integer level;

    @ApiModelProperty(value = "类型   0:目录,1:菜单, 2:按钮")
    private Integer type;

    @ApiModelProperty(value = "图标")
    private String icon;

    @ApiModelProperty(value = "排序")
    private Integer sort;

    @ApiModelProperty(value = "状态   0:失效   1:启用")
    private Integer status;

    @ApiModelProperty(value = "shiro权限标识")
    private String permit;

    @ApiModelProperty(value = "父名称")
    @TableField(exist = false)
    private String pname;

}

2、前端需要的树形格式? 这里用VO(这里我前端是用的elment-ui的树)

/**
 * 菜单的VO
 */
@Data
public class MenuVO {
    private String path;
    private String component;
    private boolean alwaysShow;
    private String name;
    private MetaVO meta;
    private List<MenuVO> children;

}

3、service实现 重点来了:

    @Override
    public List<MenuVO> getListMenuVO(List<Integer> roleId) {
        //查询出所有菜单,这里过滤了一个状态条件(mybatis-puls的写法,不了解的同学可以去看下mybatis-puls)
        QueryWrapper<SysMenu> sysMenuQueryWrapper = new QueryWrapper<>();
        sysMenuQueryWrapper.eq("status",1);
        sysMenuQueryWrapper.orderByAsc("sort");
        List<SysMenu> sysMenus = list(sysMenuQueryWrapper);
        //第一个参数必须是当前最高目录的parentId的值,这里写0也就是一级目录的parentId的值
        return recursionForMenu(0,sysMenus);
    }
    /**
     * 左侧菜单通过递归算法实现树
     * @param parentId 父Id
     * @param menuList 当前所有菜单
     * @return
     */
    private List<MenuVO> recursionForMenu(int parentId,List<SysMenu> menuList){
        List<MenuVO> list = new ArrayList<>();
        /**
         * Optional.ofNullable(menuList).orElse(new ArrayList<>())  如果menuList是空的则返回一个new ArrayList<>()
         *  .stream() 返回List中的流
         *  .filter(menu -> menu.getParentId().equals(parentId)) 筛选List,返回只有条件成立的元素(当前元素的parentId必须等于父id)
         *  .forEach 遍历这个list
         */
        Optional.ofNullable(menuList).orElse(new ArrayList<>())
                .stream()
                .filter(menu -> menu.getParentId().equals(parentId))
                .forEach(menu -> {
                    MenuVO menuVO = new MenuVO();
                    menuVO.setName(menu.getName());
                    //是否是目录
                    menuVO.setAlwaysShow(menu.getLevel().equals(1)?true:false);
                    menuVO.setPath(menu.getPath());
                    menuVO.setComponent(StringUtils.isNotEmpty(menu.getComponent())?menu.getComponent():"Layout");
                    menuVO.setMeta(new MetaVO(menu.getName(),menu.getIcon(),new ArrayList<>(Arrays.asList(1))));
                    List<MenuVO> children=recursionForMenu(menu.getMenuId(),menuList);
                    menuVO.setChildren(children);
                    list.add(menuVO);
                });
        return list;
    }

如果有了解 stream、filter的同学应该很容易看懂,代码快上给大家写了简单的注释来解释了下

4、controller控制器

    @Autowired
    private SysMenuService sysMenuService;

    @ApiOperation(value = "获取菜单树")
    @GetMapping("/getMenuList")
    public ResponseEntity<ResponseInfo> getMenuList(HttpServletRequest request) {
        ResponseInfo ri = new ResponseInfo();
        List<MenuVO> menuVOS = sysMenuService.getListMenuVO(null);
        ri.setData(menuVOS);
        return ResponseEntity.ok().body(ri.ok());
    }

5、结果

"data": [
        {
            "path": "/permission",
            "component": "Layout",
            "alwaysShow": true,
            "name": "系统管理",
            "meta": {
                "title": "系统管理",
                "icon": "el-icon-s-tools",
                "roles": [
                    1
                ]
            },
            "children": [
                {
                    "path": "organization",
                    "component": "user/organization/organization-index",
                    "alwaysShow": false,
                    "name": "企业管理",
                    "meta": {
                        "title": "企业管理",
                        "icon": "el-icon-office-building",
                        "roles": [
                            1
                        ]
                    },
                    "children": []
                },
                {
                    "path": "page",
                    "component": "permission/directive",
                    "alwaysShow": false,
                    "name": "角色管理",
                    "meta": {
                        "title": "角色管理",
                        "icon": "el-icon-s-custom",
                        "roles": [
                            1
                        ]
                    },
                    "children": []
                },
                {
                    "path": "role",
                    "component": "permission/role",
                    "alwaysShow": false,
                    "name": "部门管理",
                    "meta": {
                        "title": "部门管理",
                        "icon": "el-icon-s-home",
                        "roles": [
                            1
                        ]
                    },
                    "children": []
                },
                {
                    "path": "menu",
                    "component": "user/menu/menu-index",
                    "alwaysShow": false,
                    "name": "菜单管理",
                    "meta": {
                        "title": "菜单管理",
                        "icon": "el-icon-s-order",
                        "roles": [
                            1
                        ]
                    },
                    "children": []
                }
            ]
        }
    ]

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:24:23  更:2021-09-24 10:25:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:27:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码