Java通用三级菜单工具类

Java通用三级菜单工具类

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

实现方式

抽象属性结构

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

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

import java.util.List;

public interface AbstractTreeNode {
    // 子级id
    Long getId();

    // 父级id
    Long 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;
    // 父级板块ID
    private Long parentId;
    // 板块名
    private String boardName;
    // 封面
    private String cover;
    // 描述
    private String boardDesc;
    // 排序
    private Integer sort;
    // 0:只允许管理员发帖 1:任何人可以发帖
    private Boolean postType;
    private List<ForumBoardVo> children;

    @Override
    public 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() {
    // 数据库中list
    List<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);
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用Java实现递归三级菜单的示例代码: ```java // 获取树状菜单结构 @Override public List<Menu> findTreeMenu() { List<Menu> menus = findAllMenu(); List<Menu> rootMenus = new ArrayList<>(); // 从最上级菜单开始展示 for (Menu menu : menus) { if (menu.getPid().equals(0L)) { rootMenus.add(menu); } } for (Menu rootMenu : rootMenus) { // 获取最上级菜单的子菜单,子菜单的子菜单也会获取到 List<Menu> child = getChild(rootMenu.getId(), menus); rootMenu.setSubMenu(child); } return rootMenus; } // 获取子菜单方法 private List<Menu> getChild(Long id, List<Menu> menus) { List<Menu> childList = new ArrayList<>(); for (Menu menu : menus) { if (menu.getPid().equals(id)) { childList.add(menu); } } for (Menu menu : childList) { List<Menu> child = getChild(menu.getId(), menus); menu.setSubMenu(child); } if (childList.size() == 0) { return null; } return childList; } // 实体类设计 import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.util.List; @Data @TableName("t_menu") @JsonInclude(JsonInclude.Include.NON_NULL) public class Menu { private Long id; private String menuname; private Long pid; private String url; @TableField(exist = false) private List<Menu> subMenu; } ``` 这段代码实现了一个递归的三级菜单结构。首先,通过`findTreeMenu()`方法获取根菜单列表。然后,通过`getChild()`方法递归获取每个菜单的子菜单,直到没有子菜单为止。最后,将子菜单列表赋值给每个菜单的`subMenu`属性。实体类`Menu`定义了菜单的属性,包括菜单ID、菜单名称、父菜单ID、URL和子菜单列表。 #### 引用[.reference_title] - *1* *2* *3* [java实现三级菜单展示(递归)](https://blog.csdn.net/WoAiXiaoMingMing/article/details/121518156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值