public class TreeNode<T> {
@Schema(description = "id")
private String id;
@Schema(description = "名称")
private String name;
@Schema(description = "父级id")
private String parentId;
@Schema(description = "排序")
private Integer sort;
@Schema(description = "类型")
private String type;
@Schema(description = "别名")
private String alias;
@Schema(description = "子集")
private List<TreeNode<T>> children;
@Schema(description = "扩展字段")
private T ext;
@Schema(description = "扩展数据集")
private Object extra;
}
public class TreeBuild<T> {
private final String rootParentId = "0";
private List<TreeNode<T>> nodeList = new ArrayList<>();
public TreeBuild(List<TreeNode<T>> nodeList) {
this.nodeList = nodeList;
}
private TreeBuild() {
}
public List<TreeNode<T>> build() {
List<TreeNode<T>> treeNodes = new ArrayList<>();
getRootNode().forEach(root -> {
treeNodes.add(buildChildTree(root));
});
return treeNodes;
}
private List<TreeNode<T>> getRootNode() {
List<TreeNode<T>> rootNodeList = new ArrayList<>();
nodeList.forEach(item -> {
if (rootParentId.equals(item.getParentId())) {
rootNodeList.add(item);
}
});
return rootNodeList;
}
private TreeNode<T> buildChildTree(TreeNode<T> parentNode) {
List<TreeNode<T>> childTree = new ArrayList<>();
nodeList.forEach(item -> {
if (parentNode.getId().equals(item.getParentId())) {
childTree.add(buildChildTree(item));
}
});
parentNode.setChildren(childTree);
return parentNode;
}
}
优化后
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class TreeBuild<T> {
private final String rootParentId;
private List<? extends TreeNodeAbstract<T>> nodeList = new ArrayList<>();
public TreeBuild(List<? extends TreeNodeAbstract<T>> nodeList) {
this.nodeList = nodeList;
this.rootParentId = "0";
}
private TreeBuild(List<? extends TreeNodeAbstract<T>> nodeList,String rootParentId) {
this.nodeList = nodeList;
this.rootParentId = rootParentId;
}
public List<? extends TreeNodeAbstract<T>> build(Boolean isSort) {
List<TreeNodeAbstract<T>> treeNodes = new ArrayList<>();
getRootNode(isSort).forEach(root -> treeNodes.add(buildChildTree(root)));
if(isSort){
return treeNodes.stream().peek(item -> item.setChildren(sort(item.getChildren()))).collect(Collectors.toList());
}
return treeNodes;
}
public List<? extends TreeNodeAbstract<T>> build() {
return this.build(false);
}
private List<TreeNodeAbstract<T>> getRootNode(Boolean isSort) {
List<TreeNodeAbstract<T>> rootNodeList = new ArrayList<>();
nodeList.forEach(item -> {
if (rootParentId.equals(item.getParentId())) {
rootNodeList.add(item);
}
});
if(isSort){
return sort(rootNodeList);
}
return rootNodeList;
}
private List<TreeNodeAbstract<T>> sort(List<TreeNodeAbstract<T>> rootNodeList){
return rootNodeList.stream().sorted(Comparator.comparing(TreeNodeAbstract::getSort,Comparator.naturalOrder())).collect(Collectors.toList());
}
private TreeNodeAbstract<T> buildChildTree(TreeNodeAbstract<T> parentNode) {
List<TreeNodeAbstract<T>> childTree = new ArrayList<>();
nodeList.forEach(item -> {
if (parentNode.getId().equals(item.getParentId())) {
childTree.add(buildChildTree(item));
}
});
parentNode.setChildren(childTree);
return parentNode;
}
}
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
public class TreeNodeAbstract<T> {
@ApiModelProperty(value = "id")
private String id;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "父级id")
private String parentId;
@ApiModelProperty(value = "排序")
private Integer sort;
@ApiModelProperty(value = "类型")
private String type;
@ApiModelProperty(value = "别名")
private String alias;
@ApiModelProperty(value = "子集")
private List<TreeNodeAbstract<T>> children;
@ApiModelProperty(value = "扩展字段")
private T ext;
@ApiModelProperty(value = "扩展数据集")
private Object extra;
public TreeNodeAbstract() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public List<TreeNodeAbstract<T>> getChildren() {
return children;
}
public void setChildren(List<TreeNodeAbstract<T>> children) {
this.children = children;
}
public T getExt() {
return ext;
}
public void setExt(T ext) {
this.ext = ext;
}
public Object getExtra() {
return extra;
}
public void setExtra(Object extra) {
this.extra = extra;
}
}
使用
List<TreeNode<String>> funAuthResults = baseMapper.funAuthList(hosId, areaId);
TreeBuild<String> treeBuild = new TreeBuild<>(funAuthResults);
List<TreeNode<String>> treeNodes = treeBuild.build();