1.写一个普通树节点的抽象类
import com.fasterxml.jackson.annotation.JsonBackReference;
import lombok.Data;
import java.util.List;
@Data
public abstract class Node<T extends Node> {
private String nodeId;
private String nodeName;
private String parentId;
private T parent;
private List<T> children;
public Node(String id, String name){
this.nodeId = id;
this.nodeName = name;
}
final void addChild(T node){
this.children.add(node);
}
@JsonBackReference
final void setParent(T node){
this.parent = node;
}
}
2.普通类继承抽象的树节点类
import lombok.Data;
@Data
public class MenuNode extends AbstractNode<MenuNode> {
private String menuId;
private String menuName;
private String author;
public MenuNode(MenuEntity menuEntity) {
super(menuEntity.getMenuId(), menuEntity.getMenuName());
this.author = menuEntity.getAuthor();
}
3.树的抽象类
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class AbstractTree<T extends AbstractNode> {
private final Integer DEFAULT_INITIAL_CAPACITY = 1 << 4;
private Map<String, T> nodeMap;
private List<T> roots;
AbstractTree(List<T> abstractNodeList){
nodeMap = new HashMap<>(DEFAULT_INITIAL_CAPACITY);
roots = new ArrayList<>();
abstractNodeList.forEach(item -> {
nodeMap.put(item.getNodeId(), item);
});
buildTree();
}
private final void buildTree() {
for(T node : nodeMap.values()){
if(StringUtils.isBlank(node.getParentId())){
roots.add(node);
}
T parent = nodeMap.get(node.getParentId());
if(parent != null){
node.setParent(parent);
parent.addChild(node);
}
}
}
}
4.最后成形的一颗树
import java.util.List;
public class MenuTree extends AbstractTree<AbstractNode> {
MenuTree(List<AbstractNode> abstractNodeList) {
super(abstractNodeList);
}
}