高级JAVA - 利用函数式接口实现通用的取并集/交集/差集进阶版

在前文(高级JAVA - 利用函数式接口实现通用的取并集/交集/差集)中我们实现了利用函数式接口获取交集/差集 , 但是只能全部生成 , 假如我们只需要一个交集的话 , 所有代码仍然会执行一次 . 比较浪费资源 , 故再改进一版

package com.xing.dto;

import com.xing.common.utils.XDataUtil;

import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @title 两个集合的聚合数据 , 包含并集/交集/差集
 * @author Xingbz
 * @createDate 2019-7-23
 */
public class GatherData {
    /** 新数据集合 */
    private List newList;
    /** 旧数据集合(一般为数据库记录) */
    private List oldList;
    /** 新数据标识值集合 */
    private List newIdList;
    /** 旧数据标识值集合 */
    private List oldIdList;
    /** 业务转换对象(处理两个集合中用来标识唯一的属性) */
    private Function func;

    /** 并集 - 新集合加旧集合的数据(去重) */
    private List unionList;

    /** 交集 - 新集合和旧集合都有的数据 */
    private List intersectList;

    /** 主差集 - 新集合有 , 旧集合没有的数据 */
    private List exceptMainList;

    /** 次差价 - 旧集合有 , 新集合没有的数据 */
    private List exceptMinorList;

    /** 构造器私有 , 仅可通过对外的工厂方法访问 */
    private GatherData(List newList, List oldList, Function func) {
        this.newList = newList;
        this.oldList = oldList;
        this.func = func;
    }

    private List getNewIdList() {
        if (Objects.isNull(newIdList)) {
            newIdList = newList.stream().map(func).collect(Collectors.toList());
        }
        return newIdList;
    }

    private List getOldIdList() {
        if (Objects.isNull(oldIdList)) {
            oldIdList = oldList.stream().map(func).collect(Collectors.toList());
        }
        return oldIdList;
    }

    /** @title 获取并集 */
    public List getUnionList() {
        if (Objects.isNull(unionList)) {
            unionList = XDataUtil.addAllList(getIntersectList(), getExceptMainList(), getExceptMinorList());
        }
        return unionList;
    }

    /** @title 获取交集 */
    public List getIntersectList() {
        if (Objects.isNull(intersectList)) {
            intersectList = oldList.stream().filter(t -> getNewIdList().contains(func.apply(t))).collect(Collectors.toList());
        }
        return intersectList;
    }

    /** @title 获取主差集 */
    public List getExceptMainList() {
        if (Objects.isNull(exceptMainList)) {
            exceptMainList = newList.stream().filter(t -> !getOldIdList().contains(func.apply(t))).collect(Collectors.toList());
        }
        return exceptMainList;
    }

    /** @title 获取次差集 */
    public List getExceptMinorList() {
        if (Objects.isNull(exceptMinorList)) {
            exceptMinorList = oldList.stream().filter(t -> !getNewIdList().contains(func.apply(t))).collect(Collectors.toList());
        }
        return exceptMinorList;
    }

    /** 遍历交集操作 */
    public void unionEach(Consumer consumer) {
        getUnionList().forEach(consumer);
    }

    /** 遍历交集操作 */
    public void intersectEach(Consumer consumer) {
        getIntersectList().forEach(consumer);
    }

    /** 遍历主差集操作 */
    public void exceptMainEach(Consumer consumer) {
        getExceptMainList().forEach(consumer);
    }

    /** 遍历次差集操作 */
    public void exceptMinorEach(Consumer consumer) {
        getExceptMinorList().forEach(consumer);
    }

    /** 对外方法 , 实例化数据 */
    public static  GatherData instance(List newList, List oldList, Function func) {
        return new GatherData<>(newList, oldList, func);
    }
}

 

你可能感兴趣的:(Java,高级JAVA)