likes
comments
collection
share

Java 优雅获取菜单列表实践

作者站长头像
站长
· 阅读数 21

安能摧眉折腰事权贵,使我不得开心颜!

1 前言

在日常开发过程中,通常都会涉及到数据结构的知识,比如加载系统的菜单或者是某个菜单的子节点,我们都知道菜单的结构、企业或者公司的部门架构都属于多叉树的架构。通常数据库存储是使用 mysql 进行行存储,在查询或者存储时,都需要将行数据和树形进行转换,在本文中将以菜单加载为例介绍如何加载数据并进行数据转换。

2 问题分析

系统菜单本质是一个多叉树结构,而多叉树是一种数据结构,其中每个节点可以具有多个子节点。在 Java 中创建、遍历和获取循环多叉树的节点以及子节点是一项复杂的任务。创建菜单的问题一般都是单个创建,在 ruoyirenren 等开源项目中已经有所体现。对于多叉树的查找和遍历是一个重点问题,通常多叉树的查找采用的是递归或者迭代的算法,递归通常更容易理解,但可能面临堆栈溢出的风险,特别是在树的深度很大时。迭代方法需要使用数据结构(例如栈或队列)来跟踪遍历过程。

3 代码分析

在本文中,以 ruoyi 框架中的获取菜单列表为例,在获取菜单列表时,使用的就是递归的方法。

Java 优雅获取菜单列表实践

SysMenuServiceImpl.getChildPerms 方法目前使用的是递归的方式 recursionFn 来处理菜单的显示和组装,如果有多级的菜单递归就会深度加剧,左侧的代码需要递归调用菜单列表信息,操作比较繁琐。修改后只需要一轮 for 循环,即可实现菜单的关联。如下图所示,左侧是修改前的原始代码,右侧为优化后的代码。

Java 优雅获取菜单列表实践

这里需要先建立菜单试题和菜单id 的映射关系,利用 java 的特性参数传递的特性进行处理。然后循环遍历所有的菜单数据,如果菜单的父级Id 大于 0,则说明存在父级节点,映射关系中存在该节点的父级节点则从 map 中获取父级节点,并将该节点放入到父级节点的子节点中,最后过滤所有顶级的父节点,即可获取所有的菜单列表。

通过以上的操作,巧妙的利用了 map 的特性以及 java 的特点,解决了菜单的加载问题,该方法可以返回所有的顶级菜单列表,同时在加载到某一子菜单时,可以传入菜单的Id在 map 中查找该节点通过 getChildren() 方法即可获取到该菜单的所有子菜单。优化后不仅简洁明了获取菜单,而且降低了代码的时间复杂度。

6 总结

在本文中以菜单查询为例,通过巧妙优雅的方法来查询系统菜单,能够简洁明了地实现菜单的查询。在这个过程中重点需要理解 java 的传值特性,以及 map 循环的含义,这样就理解了这段代码的精髓。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 springboot-auth

转载自:https://juejin.cn/post/7368521915152613385
评论
请登录