Java通用三级菜单工具类

Java通用三级菜单工具类

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

实现方式

抽象属性结构

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

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

import java.util.List;public interface AbstractTreeNode {// 子级idLong getId();// 父级idLong getParentId();// 子级数组void setChildren(List<? extends AbstractTreeNode> children);
}
代码示例
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;}
}

构建树型结构

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对象,如果是直接返回数据库中对象也可,下面只做一个示例。

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.mzph.cn/bicheng/13695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring security】【pig】Note01-pig登录验证过程

&#x1f338;&#x1f338; pig 登录验证 &#x1f338;&#x1f338; pig后端源码 一、大概执行顺序&#xff0c;便于理解 pig spring-security 二、配置过滤器 配置SecurityFilterChain 三、执行过程分析 请求拦截&#xff1a; 当客户端发送请求时&#xff0c;Sprin…

Nginx反向代理与负载均衡:让网站像海豚一样灵活

引言&#xff1a;"当网站遇上海豚&#xff1a;Nginx让数据流动更流畅&#xff01;"想象一下&#xff0c;你的网站是一片繁忙的海域&#xff0c;而Nginx就像一群聪明的海豚&#xff0c;它们不仅能够迅速地找到最佳的捕食路线&#xff08;反向代理&#xff09;&#xf…

下载ubantu镜像,windows怎么复制文本到虚拟机 ubantu

目录 下载ubantu镜像 安装ubantu 开启共享剪贴板 允许root用户登录 下载ubantu镜像

Kubernetes——Pod详解

目录 一、Pod基础概念 1.概念 2.使用方式 3.Pause容器 3.1网络 3.2存储 4.Pod容器分类 4.1自主式Pod 4.2控制器管理的Pod 二、Pod的分类 1.基础容器&#xff08;infrastructure container&#xff09; 2.初始化容器&#xff08;initcontainers&#xff09; 2.1Ini…

如何找到免费的jupyter平台

第一步&#xff1a;在fofa找到大量的jupyter平台&#xff0c;部分平台会存在未授权漏洞&#xff0c;我们可以通过访问这个url查看是否可以使用&#xff08;如何使用fofa请查看其它博文&#xff09;。 第二步&#xff1a;使用python脚本快速访问下载后的目的url&#xff0c;测试…

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

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

Python 渗透测试:MySQL 数据库 弱密码测试.(3306 端口)

什么是 MySQL 数据库 MySQL 是一种开源的关系型数据库管理系统(RDBMS)。它是目前世界上最流行的数据库之一,被广泛应用于各种类型的网站和应用程序中。MySQL 数据库爆破是一种非法和危险的黑客攻击手段。它指的是通过暴力猜测密码的方式,试图获取未授权访问 MySQL 数据库的行为…

【qt】下拉列表组件

下拉列表组件 一.Combo Box1.可以直接双击编辑下拉内容2.代码初始化下拉内容3.一次性添加多个下拉内容4.下拉框手动编辑5.下拉内容添加附加值6.下拉添加图标7.获取下拉值 二.总结 一.Combo Box 还是老样子&#xff0c;咱们边做边练 目标图&#xff1a; 1.可以直接双击编辑下…

vue中动态路由

动态路由主要为了解决路由权限的问题&#xff0c;即确保每个用户登录后返回的菜单都是不同的&#xff0c;这取决于他们的权限级别。相较于静态路由&#xff0c;动态路由更加灵活&#xff0c;能够适应权限的变更&#xff0c;如新增或删除权限&#xff0c;而无需进行重复维护。 …

存储+调优:存储-Cloud

存储调优&#xff1a;存储-Cloud Master Server 配置&#xff1a; IP192.168.1.254 useradd mfs tar zxf mfs-1.6.11.tar.gz.gz cd mfs-1.6.11 ./configure --prefix/usr --sysconfdir/etc --localstatedir/var/lib --with-default-usermfs --with-default-groupmfs --disabl…

掌握一个面试小心机,就业离你只差这一步!

马上进6月份&#xff0c;大家是已经在工作岗位上了&#xff0c;还是正在面试呀&#xff01;不知道大家在面试过程中有没有遇到这样的问题&#xff0c;面试完几家公司之后进行总结&#xff0c;还是不知道自己为什么被pass掉&#xff0c;今天小编带大家搞清测试岗位面试的底层逻辑…

成为领导心腹:测试新人如何提高影响力?

作为一名新入行的测试人员&#xff0c;如何提高自己在工作中的影响力呢&#xff1f; 可能有人会问了&#xff1a;“测试人员不是只要安分守己的做好自己的测试工作不就行了吗&#xff1f;又不是当管理者&#xff0c;为什么要提高影响力呢&#xff1f;” 说实话&#xff0c;我…

【C++】学习笔记——二叉搜索树

文章目录 十四、二叉搜索树1. 二叉搜索树的概念2. 二叉搜索树的实现查找插入中序遍历删除拷贝构造析构函数赋值重载完整代码 3. 二叉搜索树的应用K搜索模型KV搜索模型 未完待续 十四、二叉搜索树 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

同旺科技 FLUKE ADPT 隔离版发布 ---- 2

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B 正面&#xff1a; 反面&#xff1a; 侧面&#xff1a; 开孔位置&#xff08;可…

面试八股之MySQL篇4——事务篇

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

react组件中的共享数据

在前面的示例中&#xff0c;每个 MyButton 都有自己独立的 count&#xff0c;当每个按钮被点击时&#xff0c;只有被点击按钮的 count 才会发生改变&#xff1a; 然而&#xff0c;你经常需要组件 共享数据并一起更新。 为了使得 MyButton 组件显示相同的 count 并一起更新&…

【MySQL精通之路】InnoDB(6)-磁盘结构(3)-表空间

主博客&#xff1a; 【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】Innodb-索引-CSDN博客 下一篇: 【MySQL精通之路】InnoDB-双写缓冲区-CSDN博客 目录 1 系统表空间 1.1 调整系统表空间的大小 1.1.1 增加 1.1.2 减小…

四川邮电职院领导访知了汇智,深化AI专业教育与行业对接

5月16日&#xff0c;四川邮电职业技术学院信息工程学院软件教研室的领导团队莅临我司&#xff0c;就人工智能专业建设进行深入的交流与学习。我司总经理、副总经理等高层领导亲自接待&#xff0c;对学院领导一行的到来表示了热烈的欢迎&#xff0c;并全程陪同参观了公司的核心区…

【技术实操】中标麒麟高级服务器操作系统实例分享,rsync数据同步配置方案

1.rsync介绍 rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份工具。 在守护进程模式&#xff08;daemon mode&#xff09;下&#xff0c;rsync默认监听TCP端口873&#xff0c;以原生rsync传输协议或者通过远程shell如RSH或者SSH提供文件。SS…

几个模型介绍

1. Diffusion Models 简介: Diffusion models是一类生成模型&#xff0c;通过将数据逐渐引入噪声并学会逆向过程&#xff0c;从噪声生成数据。这些模型近年来在图像生成领域取得了显著的进展&#xff0c;例如Denoising Diffusion Probabilistic Models (DDPM)和Score-Based Ge…