前提:数据结构必须如下
pid为一级菜单的时候有默认值
/**
* @Description: 将 list 转换为 树
*/
public static List<Map<String, Object>> listToTree(List<Authority> list, Integer pId ) {
final String STR_CHILDREN = "children";
//空间换时间,所需要的空间
HashMap<Object, Map<String, Object>> tempMap = new HashMap<>(list.size());
//最顶层的根节点
List<Map<String, Object>> rootList = new ArrayList<>();
for (Authority node : list) {
//当前节点名称
Integer id = node.getId();
//父节点名称
Integer parentid = node.getPid();
//处理当前节点,可能先处理父节点时,已经把该节点挂载子节点了,如果没有的话就新建一个
Map<String, Object> packageBody = tempMap.getOrDefault(id, new HashMap<>());
Map<String, Object> current = BeanUtil.beanToMap(node);
//把之前添加的children信息拿过来,挂载到现在的node下。putIfAbsent
current.putIfAbsent(STR_CHILDREN, packageBody.getOrDefault(STR_CHILDREN, new ArrayList<>()));
tempMap.put(id, current);
//处理顶级节点,parentid为null的情况下,为顶级节点
if (parentid.equals(pId)) {
rootList.add(current);
} else {
//把当前节点挂到父节点下
//获取父节点,父节点不存在就先初始化一个
Map<String, Object> parent = tempMap.getOrDefault(parentid, new HashMap<>());
//父节点为空情况
//1 还没处理到:创建一个, 2 没有父节点的子节点,坏的数据,丢进去,最后不会被挂到根节点下
ArrayList<Map<String, Object>> children = (ArrayList) parent.getOrDefault(STR_CHILDREN, new ArrayList());
parent.put("children", children);
//把当前节点挂载到父节点下
children.add(current);
//把父节点也挂到map中放到节点下
tempMap.put(parentid, parent);
}
}
return rootList;
}
方法中用到的BeanUtil.beanToMap来源于下面的依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>