在日常开发中,我们经常会遇到需要处理数据库中的树形数据的需求,我们需要一个工具类来减少代码的重复编写。本文将介绍一个树形数据工具类TreeUtils
,他可以将节点列表转换为树形结构,其中每个节点需要有id属性、parentId属性和子节点列表。下面是源代码:
TreeVO.java
public interface TreeVO {
/**
* 获取节点ID
*/
Integer getId();
/**
* 获取名称
*/
default String getName() {
return "";
}
/**
* 获取父节点ID
*/
Integer getParentId();
/**
* 设置子节点列表
*/
void setChildren(List<TreeVO> children);
/**
* 设置父节点名称
*/
default void setParentName(String parentName) {
}
}
TreeUtils.java
public class TreeUtils {
public static <T extends TreeVO> List<T> convertToTree(List<T> allNodes) {
return convertToTree(0, allNodes);
}
public static <T extends TreeVO> List<T> convertToTree(Integer rootId, List<T> allNodes) {
Map<Integer, List<T>> parentIdToNodeList = allNodes.stream().collect(groupingBy(T::getParentId, toList()));
Map<Integer, String> id2Name = allNodes.stream().collect(toMap(T::getId, T::getName));
for (T node : allNodes) {
node.setChildren(new ArrayList<>(parentIdToNodeList.getOrDefault(node.getId(), new ArrayList<>(0))));
node.setParentName(id2Name.getOrDefault(node.getParentId(), ""));
}
return parentIdToNodeList.getOrDefault(rootId, allNodes);
}
}
首先根节点的ID将所有节点分组,并利用节点的ID建立父节点与子节点之间的关系。最后,返回根节点的子节点列表。