实体
public abstract class TreeNode {
/**
* 当前节点id
*/
public abstract Long getNodeId();
/**
* 父级节点id
*/
public abstract Long getNodePId();
/**
* 是否根节点
*/
@Getter
private Boolean rootNode;
/**
* 是否叶子节点
**/
@Getter
private Boolean leafNode;
/**
* 子节点数据
**/
@Getter
private List<TreeNode> children;
/**
* 设置子节点数据,设置为protected禁止外部调用
**/
public void setChildren(List<TreeNode> children) {
this.children = children;
this.rootNode = Objects.equals(getNodePId(), -1L);
this.leafNode = children == null || children.isEmpty();
}
}
工具类
public class TreeUtils {
public static <T extends TreeNode> List<T> buildTree(List<T> nodes) {
if (CollectionUtils.isEmpty(nodes)) {
return Collections.emptyList();
}
Map<Long, List<TreeNode>> groups = nodes.stream().collect(Collectors.groupingBy(TreeNode::getNodePId));
return nodes.stream().filter(Objects::nonNull).peek(pnd -> {
List<TreeNode> ts = groups.get(pnd.getNodeId());
pnd.setChildren(ts);
}).filter(TreeNode::getRootNode).collect(Collectors.toList());
}
public static <T extends TreeNode> void findAll(List<T> result, TreeNode node, Long targetId) {
if (node.getNodeId().equals(targetId) || node.getNodePId().equals(targetId)) {
addAll(result, node);
} else {
if (!CollectionUtils.isEmpty(node.getChildren())) {
for (TreeNode child : node.getChildren()) {
findAll(result, child, targetId);
}
}
}
}
private static <T extends TreeNode> void addAll(List<T> result, TreeNode node) {
result.add((T) node);
if (!CollectionUtils.isEmpty(node.getChildren())) {
for (TreeNode child : node.getChildren()) {
addAll(result, child);
}
}
}
}