Java通用三级菜单工具类

devtools/2024/10/21 7:38:08/

Java通用三级菜单工具类

通常在写三级菜单时会使用递归方式去写,但是时间长了会发现很多重复的代码一直在写,改,也就改几个名字。

实现方式

抽象属性结构

常用的三个字段,子级id、父级id、其次是数组children。

将返回对象或者是三级菜单对象实现这个类。

java">import java.util.List;public interface AbstractTreeNode {// 子级idLong getId();// 父级idLong getParentId();// 子级数组void setChildren(List<? extends AbstractTreeNode> children);
}
代码示例
java">import cn.bunny.tree.AbstractTreeNode;
import lombok.Data;import java.util.List;@Data
public class ForumBoardVo implements AbstractTreeNode {private Long id;// 父级板块IDprivate Long parentId;// 板块名private String boardName;// 封面private String cover;// 描述private String boardDesc;// 排序private Integer sort;// 0:只允许管理员发帖 1:任何人可以发帖private Boolean postType;private List<ForumBoardVo> children;@Overridepublic void setChildren(List<? extends AbstractTreeNode> children) {this.children = (List<ForumBoardVo>) children;}
}

构建树型结构

java">import java.util.ArrayList;
import java.util.List;public class TreeBuilder<T extends AbstractTreeNode> {/*** 构建属性结构** @param nodeList 需要构建的数组* @return 树型结构*/public List<T> buildTree(List<T> nodeList) {List<T> tree = new ArrayList<>();for (T node : nodeList) {if (node.getParentId() == 0) {node.setChildren(getChildren(node.getId(), nodeList));tree.add(node);}}return tree;}/*** 递归设置子级菜单** @param nodeId   节点id* @param nodeList 节点列表* @return 子级菜单*/private List<T> getChildren(Long nodeId, List<T> nodeList) {List<T> children = new ArrayList<>();for (T node : nodeList) {if (node.getParentId().equals(nodeId)) {node.setChildren(getChildren(node.getId(), nodeList));children.add(node);}}return children;}
}
使用方式

先向正常的返回数组使用,毕竟我们是要返回VO对象,如果是直接返回数据库中对象也可,下面只做一个示例。

java">public List<ForumBoardVo> loadBoard() {// 数据库中listList<ForumBoard> forumBoardListDB = list();// 构建返回对象数组List<ForumBoardVo> forumBoardVoList = new ArrayList<>();// 树型结构返回数组TreeBuilder<ForumBoardVo> treeBuilder = new TreeBuilder<>();// 对数据库中数组进行排序,这个可有可无forumBoardListDB.sort(Comparator.comparing(ForumBoard::getSort));// 将数据库中数组一个一个塞到 List<ForumBoardVo> 的数组中forumBoardListDB.forEach(forumBoard -> {ForumBoardVo forumBoardVo = new ForumBoardVo();BeanUtils.copyProperties(forumBoard, forumBoardVo);forumBoardVoList.add(forumBoardVo);});// 最后将调用树形结构对象,构建树型结构。return treeBuilder.buildTree(forumBoardVoList);
}

http://www.ppmy.cn/devtools/42453.html

相关文章

Linux 进程

文章目录 冯诺依曼体系 操作系统为什么要有操作系统系统调用和库函数概念进程的组成如何理解进程动态运行系统调用接口和用户操作接口 进程PCBPIDPCB和PIDgetpid()getppid()获取父进程pidfork() 创建进程父子进程为什么要创建子进程/proc 目录内查看进程文件夹chdir()改变进程的…

【文末附gpt升级方案】AIGC(人工智能):技术革命与人类未来的深度解析

AIGC&#xff08;人工智能&#xff09;&#xff1a;技术革命与人类未来的深度解析 摘要&#xff1a;随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已成为现代社会的重要支柱。其中&#xff0c;AIGC&#xff08;Artificial Intelligence Generated Conten…

STM32中SPI的使用

SPI&#xff08;Serial Peripheral Interface&#xff09;是一种高速、全双工、同步的通信协议&#xff0c;它广泛应用于微控制器与外设或其他微控制器之间的通信。SPI通过至少四条线路进行通信&#xff1a;一条串行时钟&#xff08;SCLK&#xff09;、一条主设备输出/从设备输…

C++—数组

数组是由一批相同类型的元素&#xff08;element&#xff09;的集合所组成的数据结构&#xff0c;分配一块连续的内存来存储。 语法&#xff1a; <数据类型> <数组名>[<数组长度>]; 数据类型&#xff1a;数组内存放的数据类型&#xff0c;如int、char&…

CR80清洁卡都能用在什么地方?

CR80清洁卡&#xff08;也被称为ISO 7810 ID-1清洁卡&#xff09;的规格确实使其在各种需要读取磁条或接触式智能卡的设备中都有广泛的用途。这些设备包括但不限于&#xff1a; ATM自动终端机&#xff1a;当ATM机的磁条读卡器出现故障或读卡不灵敏时&#xff0c;可以使用CR80清…

基于地理坐标的高阶几何编辑工具算法(4)——线分割面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 选中待分割面&#xff0c;点击“线分割面”工具&#xff0c;绘制和面至少两个交点的线&#xff0c;双击结束&#xff0c;执行分割操作 应用场景 快速切分大型几何面&#xff0c;以降低面的复杂度&…

我在去哪儿薅到了5块钱火车票代金券,速薅

哈哈&#xff0c;亲爱的薅羊毛小伙伴们&#xff01; 刚刚在去哪儿大佬那儿发现了一个超级薅羊毛福利&#xff01;我只花了短短两分钟&#xff0c;就搞到了一张5块钱火车票代金券&#xff0c;简直是天上掉馅饼的节奏啊&#xff01; 话不多说&#xff0c;薅羊毛的姿势给你们摆好…

第13章 Python建模库介绍

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 本书中&#xff0c;我已经介绍了Python数据分析的编程基…