运行方法:
@Override
public List<CategoryTreeInfoVo> getTree() {
List<CategoryInfoVo> all = categoryDao.getAll();
//todo-xzw 查询已关联分类
//todo-xzw 去除已关联分类
//todo-xzw 递归生成树形结构
List<CategoryTreeInfoVo> categoryInfoVos = streamMethod("0", all);
return categoryInfoVos;
}
核心代码:
/**
* 递归生成树形结构 最子集非叶子结点则去除树分支
* @param parentCode
* @param treeList
* @return
*/
public static List<CategoryTreeInfoVo> streamMethod(String parentCode, List<CategoryInfoVo> treeList) {
List<CategoryTreeInfoVo> list = new ArrayList<>();
Optional.ofNullable(treeList).orElse(new ArrayList<>())
.stream()
// 第一次筛选出主父节点列表进入循环,循环里面 进入递归 筛选出递归传递的从父节点列表
.filter(root -> root.getParentCode().equals(parentCode))
// 递归,最末的父节点从整个列表筛选出它的子节点列表依次组装
.forEach(tree -> {
List<CategoryTreeInfoVo> children = streamMethod(tree.getCategoryCode(), treeList);
if (CollectionUtils.isNotEmpty(children)){
tree.setSubList(children);
}
CategoryTreeInfoVo build = CategoryTreeInfoVo.builder()
.categoryCode(tree.getCategoryCode())
.categoryName(tree.getCategoryName())
.nameFullPath(tree.getNameFullPath())
.codeFullPath(tree.getCodeFullPath())
.leafFlag(tree.getLeafFlag())
.parentCode(tree.getParentCode())
.levelNum(tree.getLevelNum())
.sortId(tree.getSortId())
.subList(tree.getSubList())
.build();
if (build.getLeafFlag() != 1) {
if (CollectionUtils.isNotEmpty(build.getSubList())) {
list.add(build);
}
} else {
list.add(build);
}
});
return list;
}
实体类CategoryTreeInfoVo:
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.SuperBuilder;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper=false)
public class CategoryTreeInfoVo implements Serializable {
static final long serialVersionUID = -8381625102964439804L;
String categoryCode;
String categoryName;
String parentCode;
String sortId;
String nameFullPath;
String codeFullPath;
int leafFlag;
int levelNum;
public List<CategoryTreeInfoVo> subList;
}
实体类:CategoryInfoVo
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* 类目配置
*/
@Data
public class CategoryInfoVo implements Serializable {
static final long serialVersionUID = -8381625102964439804L;
String categoryCode;
String categoryName;
String parentCode;
String sortId;
String nameFullPath;
Integer disabled;
Integer deleted;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime createTime;
String createUser;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime updateTime;
String updateUser;
String codeFullPath;
int leafFlag;
int levelNum;
public List<CategoryTreeInfoVo> subList;
}