环境
jdk1.8
实体
public class SysMenu implements Serializable {
private static final long serialVersionUID = 551217284660329182428L;
@ApiModelProperty("菜单id")
private Long id;
@ApiModelProperty("菜单父id")
private Long parentId;
@ApiModelProperty("菜单地址")
private String url;
@ApiModelProperty("菜单标题名称")
private String name;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("子节点(可以根据当前是否为空来判断是否有下级菜单(或者根据这个是否为空来判断当前 url是否可点击))")
private List<SysMenu> children;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public List<SysMenu> getChildren() {
return children;
}
public void setChildren(List<SysMenu> children) {
this.children = children;
}
}
菜单列表转树
private List<SysMenu> sysMenuTree(List<SysMenu> sysMenus) {
List<SysMenu> nodeTrees = new ArrayList<>();
Map<Long, SysMenu> sysMenuMap = sysMenus.stream().collect(Collectors.toMap(SysMenu::getId, sysMenu -> sysMenu));
for (Long id : sysMenuMap.keySet()) {
SysMenu sysMenu = sysMenuMap.get(id);
Long parentId = sysMenu.getParentId();
if (parentId == null || parentId == 0L || !sysMenuMap.containsKey(parentId)) {
nodeTrees.add(sysMenu);
} else {
SysMenu parentTreeNode = sysMenuMap.get(parentId);
if (parentTreeNode.getChildren() == null) {
parentTreeNode.setChildren(new ArrayList<>());
}
parentTreeNode.getChildren().add(sysMenu);
parentTreeNode.getChildren().sort(Comparator.comparing(SysMenu::getSort));
}
}
//取根节点的树
nodeTrees = nodeTrees.stream().filter(sysMenu -> sysMenu.getParentId() == 0L).collect(Collectors.toList());
return nodeTrees;
}