递归生成树形结构 最子集非叶子结点则去除树分支

运行方法:
    @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;

}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值