環境
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;
}