多级菜单 递归 Java

采用递归实现多级菜单
1.菜单对象

@Data
public class SysMenuEntity {
    /**菜单id*/
    private Long id;

    /**父菜单id,一级菜单为0*/
    private Long parentId;

    /**菜单名称*/
    private String menuName;

    /** 菜单URL*/
    private String menuUrl;

    /**类型  0:目录   1:菜单   2:按钮*/
    private Integer menuType;

    /** 菜单图标*/
    private String menuIcon;

    /**排序*/
    private Integer orderNum;

    /**子菜单*/
    private List<SysMenuEntity> childMenuList;
}

2.菜单排序

    /**
     * 排序,根据orderNum升序排列
     *
     * @return 排序器
     */
    private Comparator<SysMenuEntity> order() {
        return (menu1, menu2) -> {
            if (!menu1.getOrderNum().equals(menu2.getOrderNum())) {
                return menu1.getOrderNum() - menu2.getOrderNum();
            }
            return 0;
        };
    }

3.获取子菜单列表

 /**
     * 获取子菜单列表
     *
     * @param parentId    父菜单id
     * @param allMenuList 所有菜单列表
     * @return 每个父菜单下的子菜单列表
     */
    private List<SysMenuEntity> getChildMenuList(Long parentId, List<SysMenuEntity> allMenuList) {
        //子菜单列表
        List<SysMenuEntity> childMenuList = allMenuList.stream()
                //父菜单id与当前菜单的父菜单id相同,添加到当前菜单的子菜单中
                .filter(m -> parentId.equals(m.getParentId()))
                .collect(Collectors.toList());
        //递归调用
        childMenuList.forEach(e -> e.setChildMenuList(getChildMenuList(e.getId(), allMenuList)));
        childMenuList.sort(order());
        //当前菜单下没有子菜单,返回空list,退出递归
        if (childMenuList.size() == 0) {
            return new ArrayList<>();
        }
        return childMenuList;
    }

4.获取完整菜单列表树

    /**
     * 获取菜单列表
     *
     * @return 菜单列表
     */
    public List<SysMenuEntity> listMenu() {
        //获取数据库中所有菜单列表
        List<SysMenuEntity> allMenuList = menuMapper.listSysMenu();
        //根菜单列表,并排序
        List<SysMenuEntity> rootMenuList = allMenuList.stream()
                //父菜单是0的为根菜单。
                .filter(e -> Long.valueOf(0).equals(e.getParentId()))
                //排序
                .sorted(order())
                .collect(Collectors.toList());
        //为根菜单设置子菜单
        rootMenuList.forEach(e -> e.setChildMenuList(getChildMenuList(e.getId(), allMenuList)));
        //为根菜单设置子菜单
        return rootMenuList;
    }
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

包耳邹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值