Java通用树状结构工具
基础树状节点
@Data
public class BaseTreeNode<C,T> {
private T id;
private T parentId;
private List<C> children;
}
C:指你想放返回的数据类型,这里没有加限制,应该是< C extend BaseTreeNode >
就是你返回的所有TreeNode类要继承这个BaseTreeNode,比如:
@Data
public class TestTreeVo extends BaseTreeNode<TestTreeVo ,Long> {
private String tagName;
}
树状结构生成器
这里利用stream流分组
public class TreeNodeConvertUtils {
public static <C extends BaseTreeNode<C,T>,T> List<C> getChildNodes(List<C> source, T id) {
Map< T , List<C>> result =
source.stream().collect(Collectors.groupingBy(BaseTreeNode::getParentId));
source.forEach(item -> item.setChildren(result.get(item.getId())));
return result.get(id);
}
}
具体调用,比如获取root节点下所有数据(整个Tree)
public List<TestTreeVo> getTagCatelogList(TaggingQueryDto taggingQueryDto) {
List<Test> records = list();
List<TestTreeVo> userTaggingListVos = OrikaBeanUtils.mapAsList(records, TestTreeVo.class);
return TreeNodeConvertUtils.getChildNodes(userTaggingListVos, 0L);
}
我的root节点id是0,因此我获取0节点下数据就是整个树的数据,如果需要获取某个节点数据,比如你的字典树,你只需要传对应的节点id即可。
PS
以上还是根据项目的需要,自己更改适配性,也可以去用hutools里面的treeUtil,那个扩展性是不错,但是感觉过于繁琐,没必要,具体问题具体分析,怎么方便怎么来吧