关于Java中多级菜单树的处理

  • 今天被一个菜单列表的展现折磨得不轻,自己写代码发现实在是费时费力,而且代码量太大,逻辑亟待优化,后续找到了这个代码十分简洁的工具类,说实话我只能看得懂,写不出来这种东西。在此分享给大家,避免重复造轮子的工作~

多级树Bean

这是一个基础bean:

/**
 * 功能描述:
 * 【分组信息bean】
 * 注意,下面的bean每个属性都为必要属性,不可缺一
 * 可以在此bean基础上再添加多个属性,不会影响树结构
 * 类上的三个注解为lombok插件
 *
 * @author chihiro
 * @version V1.0
 * @date 2019/03/06 17:35
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GroupInfoBean {
   
    /**
     * 分组主键
     */
    private String groupId;
    /**
     * 父节点id
     */
    private String parentId;
    /**
     * 子节点集合
     */
    private List<GroupInfoVo> children;
}

树工具类

核心工具类:

/**
 * 功能描述:
 * 【多级树util】
 * 核心是使用递归
 *
 * @author chihiro
 * @version V1.0
 * @date 2019/03/06 18:45
 */
@AllArgsConstructor
public class TreeToolUtil {

    /**
     * 根节点
     */
    private List<GroupInfoVo> rootList;
    /**
     * 叶子节点,可包含跟节点
     */
    private List<GroupInfoVo> bodyList;

    public List<GroupInfoVo> getTree() {
        if (CollUtil.isNotEmpty(bodyList)) {
            //声明一个map,用来过滤已操作过的数据
            Map<String, String> map = MapUtil.newHashMap(bodyList.size());
            rootList.forEach(beanTree -> getChild(beanTree, map));
            return rootList;
        }
        return null;
    }

    private void getChild(GroupInfoVo beanTree, Map<String, String> map) {
        List<GroupInfoVo> childList = CollUtil.newArrayList();
        bodyList.stream()
                .filter(group -> !map.containsKey(group.getGroupId()))
                .filter(group -> group.getParentId().equals(beanTree.getGroupId()))
                .forEach(group -> {
                    map.put(group.getGroupId(), group.getParentId());
                    getChild(group, map);
                    childList.add(group);
                });
        beanTree.setChildren(childList);
    }
}

备注

  • 这套代码也是本人从网上找来调整为自己使用的,非本人自主构建。
  • 若遇到其他Bug,请通过博客内联系方式找到我,我尽量解决。