java
@Override
public List<ConfServiceVO> allTree(ConfServiceVO confService) throws Exception {
List<ConfServiceEntity> equClassifies = this.list();
if (CollectionUtil.isEmpty(equClassifies)) {
return new ArrayList<>();
}
List<ConfServiceVO> confServiceVOS = ConfServiceWrapper.build().listVO(equClassifies);
// 整理非标准树
List<ConfServiceVO> treeList = this.getTree(confServiceVOS);
// 根据业务需求 ,可能需要获取某一个根节点下的叶子 正常情况可去掉
if ( confService != null && confService.getId() != null) {
// 遍历树,找到指定的根节点
for (ConfServiceVO root : treeList) {
if (root.getId().equals(confService.getId())) {
// 返回指定根节点下的所有叶子
return root.getChildren();
}
}
}
return treeList;
}
//自己写的树形结构 递归找儿
private List<ConfServiceVO> getChildrenCategory(ConfServiceVO root,List<ConfServiceVO> all){
List<ConfServiceVO> children = all.stream().filter(categoryEntity -> {
return categoryEntity.getParentId().equals(root.getId());
}).map(categoryEntity -> {
//找到了子分类并设置
categoryEntity.setChildren(getChildrenCategory(categoryEntity,all));
return categoryEntity;
}).sorted((category1,category2) ->{
return ( category1.getSno() == null ? 0: category1.getSno() ) -
(category2.getSno() == null ? 0: category2.getSno() );
}).collect(Collectors.toList());
return children;
}
//传入树形结构list,返回树形
public List<ConfServiceVO> getTree(List<ConfServiceVO> categoryList) throws Exception {
List<ConfServiceVO> categoryTree = categoryList.stream().filter(categoryEntity -> {
//过滤 返回一级分类
return categoryEntity.getParentId().equals("0");
}).map(category -> {
//进行map映射 ,给每个分类进行子分类(用递归)
List<ConfServiceVO> childrenCategory = getChildrenCategory(category, categoryList);
category.setChildren(childrenCategory);
return category;
}).sorted((category1, category2) -> {
return (category1.getSno() == null ? 0 : category1.getSno()) - (category2.getSno() == null ? 0 : category2.getSno());
}).collect(Collectors.toList());
return categoryTree;
}
本文介绍了树形结构数据处理方法,包含三个核心方法:1) allTree方法获取完整树形数据,支持按指定根节点筛选子节点;2) getChildrenCategory递归查找子节点并排序;3) getTree构建完整树形结构,从一级节点开始逐层嵌套子节点。所有方法均按sno字段排序,处理了空值情况,实现了树形数据的层级组织和灵活查询功能。代码结构清晰,采用流式处理提高可读性。