一、实体类实例
public class SysMenu implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 路径
*/
private String path;
/**
* 图标
*/
private String icon;
/**
* 父id
*/
private Integer pid;
/**
* 描述
*/
private String description;
@TableField(exist = false)
private List<SysMenu> children;
}
注:实体类中注解是mybatis-plus相关的注解
数据库中数据为:
二 、工具类代码
package com.example.boot.util;
import com.example.boot.entity.SysMenu;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @ClassName
* @Description TODO
* @Author 小菜鸟
* Date 2023/9/14 17:02
**/
public class TreeUtil {
public static List<SysMenu> buildTree(List<SysMenu> menuList,Integer pid) {
// 创建一个Map,以id作为键,以SysMenu对象作为值
for (SysMenu sysMenu : menuList) {
menuMap.put(sysMenu.getId(),sysMenu);
}
// 遍历菜单列表,构建树结构
List<SysMenu> tree = new ArrayList<>();
for (SysMenu menu : menuList) {
if (menu.getPid() == null || menu.getPid() == pid) {
tree.add(menu); // 根节点
} else {
SysMenu parent = menuMap.get(menu.getPid());
if (parent != null) {
if (parent.getChildren() == null) {
parent.setChildren(new ArrayList<>());
}
parent.getChildren().add(menu);
}
}
}
return tree;
}
}
注: 类中menuList 、menuMap、tree 和parent 存储的sysMenu对象指向的地址都只一样的。所以一个修改,其他的都会修改,我这里的根节点为-1
返回结果为: