集合转为树结构工具

表头

工具类

java 复制代码
public class ThreeUtils {


    /**
     * 树结构转换处理-每次递归查询全部下级以及下级的子集
     *
     * @param menuList     需要处理的数据集
     * @param threeResult  返回对象
     * @param parentId     父级ID
     * @param dataTreating 逻辑处理
     * @param <T>
     */
    public static <T extends Three, E extends Three> void treeListAncestral(List<T> menuList, E threeResult, Long parentId, ThreeFunctional<T, E> dataTreating) {
        if (ObjectUtil.isEmpty(menuList)) {
            return;
        }
        Map<Long, List<T>> collect = menuList.stream().filter(menu -> menu != null && menu.getParentId() != null).collect(Collectors.groupingBy(Three::getParentId));
        //根据父级ID查询下级
        List<T> threes = collect.get(parentId);
        if (ObjectUtil.isEmpty(threes)) {
            return;
        }
        ArrayList<T> groupT = threes.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(T::getId))), ArrayList::new));
        for (T three : groupT) {
            /*根据本次循环ID查询所有下级以及子集*/
            List<T> ancestralThreeList = menuList.stream().filter(m -> StringUtil.leftPad(String.valueOf(m.getId()), String.valueOf(m.getId()).length()).equals(String.valueOf(three.getId()))).collect(Collectors.toList());
            if (ObjectUtil.isEmpty(ancestralThreeList)) {
                continue;
            }
            //树处理逻辑
            E e = dataTreating.dataTreating(ancestralThreeList, threeResult);
            if (null == e) {
                return;
            }
            /*创建下级返回对象类,并且存入当前上级的下级集合中*/
            List<E> itemList = threeResult.getItemList();
            if (null == itemList) {
                itemList = new ArrayList<>();
            }
            itemList.add(e);
            threeResult.setItemList(itemList);
            //执行递归处理
            treeListAncestral(menuList, e, three.getId(), dataTreating);
        }
    }


    /**
     * 树结构转换处理-每次递归查询下级
     *
     * @param menuList     树处理集合
     * @param threeResult  返回对象
     * @param parentId     父级ID
     * @param dataTreating 逻辑处理
     * @param <T>
     */
    public static <T extends Three, E extends Three> void treeList(List<T> menuList, E threeResult, Long parentId, ThreeFunctional<T, E> dataTreating) {
        if (ObjectUtil.isEmpty(menuList)) {
            return;
        }
        Map<Long, List<T>> collect = menuList.stream().filter(menu -> menu != null && menu.getParentId() != null).collect(Collectors.groupingBy(Three::getParentId));
        //根据父级ID查询下级
        List<T> threes = collect.get(parentId);
        if (ObjectUtil.isEmpty(threes)) {
            return;
        }
        ArrayList<T> groupT = threes.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(T::getId))), ArrayList::new));
        for (T three : groupT) {
            /*根据本次循环ID查询所有下级*/
            List<T> ancestralThreeList = menuList.stream().filter(menu -> menu != null && menu.getParentId() != null && menu.getParentId().equals(three.getId())).collect(Collectors.toList());
            if (ObjectUtil.isEmpty(ancestralThreeList)) {
                continue;
            }
            //树处理逻辑
            E e = dataTreating.dataTreating(ancestralThreeList, threeResult);
            if (null == e) {
                return;
            }
            /*创建下级返回对象类,并且存入当前上级的下级集合中*/
            List<E> itemList = threeResult.getItemList();
            if (null == itemList) {
                itemList = new ArrayList<>();
            }
            itemList.add(e);
            threeResult.setItemList(itemList);
            //执行递归处理
            treeList(menuList, e, three.getId(), dataTreating);
        }
    }
}

树处理函数接口

java 复制代码
@FunctionalInterface
public interface ThreeFunctional<T, E> {

    /**
     * 树处理逻辑
     *
     * @param threeList 处理后的树结构
     * @param data      处理后的树类结果对象
     *                  这里返回创建一个新的空对象即可
     */
    E dataTreating(List<T> threeList, E data);
}

树实体类

java 复制代码
@Data
public class Three<E> implements Serializable {
    private static final long serialVersionUID = 2883288479291688378L;

    private Long id;

    private String name;

    private Long parentId;

    //数据结果集
    private List<E> ItemList;

}

请求响应实体类

java 复制代码
@Data
@ApiModel("返回VO")
public class CoveredCountyEnteringVO extends Three<CoveredCountyEnteringVO> implements Serializable {
    private static final long serialVersionUID = -1571960669989120842L;

    private Integer monitorBabyNumber;

    private Integer standardBabyNumber;

    private BigDecimal percentOfPass;

}

@Data
@ApiModel("响应DTO")
public class CoveredCountyEnteringDTO extends Three<CoveredCountyEnteringDTO> implements Serializable {
    private static final long serialVersionUID = -1571960669989120842L;

    private String medicalQuestion1;


    private String medicalQuestion3;

    private String medicalQuestion7;


}

调用

java 复制代码
  //需要处理的数据集合-需要继承 Three类
        List<CoveredCountyEnteringDTO> questionnaireList = cniQuestionnaireMapper.selectByAreaCode(reportFormsDTO);
        //创建返回对象-继承 Three类
        CoveredCountyEnteringVO countyEnteringVO = new CoveredCountyEnteringVO();

        ThreeUtils.treeListAncestral(questionnaireList, countyEnteringVO, reportFormsDTO.getAreaCode(), (threeList, data) -> {
            if (ObjectUtil.isEmpty(threeList)) {
                return null;
            }
            Long monitorBabyNumber = threeList.stream().count();
            Stream<CoveredCountyEnteringDTO> standardBabyNumber = threeList.stream().filter(coveredCountyEnteringDTO -> null != coveredCountyEnteringDTO
                    && StringUtils.isNotBlank(coveredCountyEnteringDTO.getMedicalQuestion1())
                    && StringUtils.isNotBlank(coveredCountyEnteringDTO.getMedicalQuestion3())
                    && StringUtils.isNotBlank(coveredCountyEnteringDTO.getMedicalQuestion7()));

            CoveredCountyEnteringDTO coveredCountyEnteringDTO = threeList.get(0);
            /*将处理后的数据放入 data集合中*/
            CoveredCountyEnteringVO resultCoveredCountVO = new CoveredCountyEnteringVO();
            resultCoveredCountVO.setId(coveredCountyEnteringDTO.getId());
            resultCoveredCountVO.setName(coveredCountyEnteringDTO.getName());
            resultCoveredCountVO.setParentId(coveredCountyEnteringDTO.getParentId());

            resultCoveredCountVO.setMonitorBabyNumber(null != monitorBabyNumber ? Integer.valueOf(monitorBabyNumber + "") : 0);
            resultCoveredCountVO.setStandardBabyNumber(ObjectUtil.isNotEmpty(standardBabyNumber) ? Integer.valueOf(standardBabyNumber.count() + "") : 0);
            /*计算合格率*/
            resultCoveredCountVO.setPercentOfPass(BigDecimalUtils.rate(resultCoveredCountVO.getStandardBabyNumber() + "", resultCoveredCountVO.getMonitorBabyNumber() + ""));
            return resultCoveredCountVO;
        });
相关推荐
风筝在晴天搁浅2 分钟前
解题代码清爽版
java·开发语言
NeverFear7924 分钟前
【黑马点评】短信登录
java·redis·tomcat·intellij-idea
2601_9622986737 分钟前
正则表达式引擎 哪些
java·python·perl·pcre·正则表达式引擎
孙克旭_38 分钟前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx41 分钟前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
布吉岛的石头43 分钟前
Java 程序员第 48 阶段1:Transformer 架构总览与自注意力直觉,从 RNN 痛点理解注意力机制
java·架构·transformer
吴声子夜歌1 小时前
Guava——事件总线
java·网络·guava
en.en..1 小时前
Ubuntu嵌入式开发 export环境变量
java·开发语言·数据库
gf13211111 小时前
【python_回复邮件】
android·java·python
攻城有术1 小时前
专项攻克——重写 Redis 依赖包方法的 6 种实现方式
java·数据库·redis·bootstrap