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

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

多级树Bean

这是一个基础bean:

/**
 * 功能描述:
 * 【分组信息bean】
 * 注意,下面的bean每个属性都为必要属性,不可缺一
 * 继承此bean再添加多个属性,不会影响树结构
 * 类上的三个注解为lombok插件
 *
 * @author chihiro
 * @version V1.0
 * @date 2019/03/06 17:35
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseTree implements Serializable {

    private static final long serialVersionUID = 8L;
    /**
     * 树主键
     */
    private String treeId;
    /**
     * 父节点id
     */
    private String parentId;
    /**
     * 子节点集合
     */
    private List<? extends BaseTree> childrens;
}

树工具类

核心工具类:

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

    /**
     * 根节点
     */
    private List<T> rootList;
    /**
     * 叶子节点
     */
    private List<T> bodyList;

    public List<T> 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(T beanTree, Map<String, String> map) {
        List<BaseTree> childList = CollUtil.newArrayList();
        bodyList.stream()
                .filter(group -> !map.containsKey(group.getTreeId()))
                .filter(group -> group.getParentId().equals(beanTree.getTreeId()))
                .forEach(group -> {
                    map.put(group.getTreeId(), group.getParentId());
                    getChild(group, map);
                    childList.add(group);
                });
        beanTree.setChildrens(childList);
    }
}

后记

  • 若发现bug,请联系博主