关于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,请通过博客内联系方式找到我,我尽量解决。