在前文(高级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<T, R> {/** 新数据集合 */private List<T> newList;/** 旧数据集合(一般为数据库记录) */private List<T> oldList;/** 新数据标识值集合 */private List<R> newIdList;/** 旧数据标识值集合 */private List<R> oldIdList;/** 业务转换对象(处理两个集合中用来标识唯一的属性) */private Function<T, R> func;/** 并集 - 新集合加旧集合的数据(去重) */private List<T> unionList;/** 交集 - 新集合和旧集合都有的数据 */private List<T> intersectList;/** 主差集 - 新集合有 , 旧集合没有的数据 */private List<T> exceptMainList;/** 次差价 - 旧集合有 , 新集合没有的数据 */private List<T> exceptMinorList;/** 构造器私有 , 仅可通过对外的工厂方法访问 */private GatherData(List<T> newList, List<T> oldList, Function<T, R> func) {this.newList = newList;this.oldList = oldList;this.func = func;}private List<R> getNewIdList() {if (Objects.isNull(newIdList)) {newIdList = newList.stream().map(func).collect(Collectors.toList());}return newIdList;}private List<R> getOldIdList() {if (Objects.isNull(oldIdList)) {oldIdList = oldList.stream().map(func).collect(Collectors.toList());}return oldIdList;}/** @title 获取并集 */public List<T> getUnionList() {if (Objects.isNull(unionList)) {unionList = XDataUtil.addAllList(getIntersectList(), getExceptMainList(), getExceptMinorList());}return unionList;}/** @title 获取交集 */public List<T> getIntersectList() {if (Objects.isNull(intersectList)) {intersectList = oldList.stream().filter(t -> getNewIdList().contains(func.apply(t))).collect(Collectors.toList());}return intersectList;}/** @title 获取主差集 */public List<T> getExceptMainList() {if (Objects.isNull(exceptMainList)) {exceptMainList = newList.stream().filter(t -> !getOldIdList().contains(func.apply(t))).collect(Collectors.toList());}return exceptMainList;}/** @title 获取次差集 */public List<T> getExceptMinorList() {if (Objects.isNull(exceptMinorList)) {exceptMinorList = oldList.stream().filter(t -> !getNewIdList().contains(func.apply(t))).collect(Collectors.toList());}return exceptMinorList;}/** 遍历交集操作 */public void unionEach(Consumer<? super T> consumer) {getUnionList().forEach(consumer);}/** 遍历交集操作 */public void intersectEach(Consumer<? super T> consumer) {getIntersectList().forEach(consumer);}/** 遍历主差集操作 */public void exceptMainEach(Consumer<? super T> consumer) {getExceptMainList().forEach(consumer);}/** 遍历次差集操作 */public void exceptMinorEach(Consumer<? super T> consumer) {getExceptMinorList().forEach(consumer);}/** 对外方法 , 实例化数据 */public static <T, R> GatherData<T, R> instance(List<T> newList, List<T> oldList, Function<T, R> func) {return new GatherData<>(newList, oldList, func);}
}

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

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

    package com.xing.dto;import com.xing.common.utils.XDataUtil; import lombok.Data;import java.util.Arr ...

  2. 学习 Java 8 - 函数式接口 Lambda

    学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...

  3. java中函数式接口的使用

    java中函数式接口的使用 一.自己创建的函数式接口 1.1 概念 只存在一个抽象方法的接口. 1.2 使用步骤: 1.创建函数式接口,创建格式参照使用格式. 2.创建一个实例类 3.在实例类中使用函 ...

  4. Java之函数式接口(FunctionalInterface)

    Java之函数式接口(FunctionalInterface) 1. FunctionalInterface是什么? FunctionalInterface 中文称之为 函数式接口.是Java新特性之 ...

  5. 【java】函数式接口和Stream

    函数式接口和Stream 函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接口 1.4 消费函数式接口 Consumer 1.5 生产者 ...

  6. Java四大函数式接口

    Java8函数式接口 1. Consumer<T> 消费型接口 2. Supplier <R> 供给型接口 3. Function<T, R> 函数型接口 4. P ...

  7. 【Java】函数式接口与Lambda表达式

    函数式接口--@FunctionalInterface Code @FunctionalInterface interface IService {void say(String message); ...

  8. java自定义函数式接口

    ⾃定义lambda接⼝流程 定义⼀个函数式接⼝ 需要标注此接⼝ @FunctionalInterface,否则万⼀团队成员在接⼝上加 了其他⽅法则容易出故障 编写⼀个⽅法,输⼊需要操做的数据和接⼝ 在 ...

  9. java 8 函数式接口_必看:通俗易懂地告诉你什么是java8中的“函数式接口”

    花10分钟认真的看完一篇文章,或许会有意想不到的收获 java8发布已经好几年了,相信很多小伙伴都使用过java8,java8这版本带来了很多新特性,其中一个就是"函数式接口",今 ...

最新文章

  1. 2015前端生态发展回顾(转)
  2. 为什么 ++[[]][+[]]+[+[]] = 10 ?
  3. .net语言_小白对入门语言的选择,C、C++、Java、Python、.NET该怎么选?
  4. git_day03_01——git远程仓库的使用
  5. VB.NET 读写HTML 文件,VB.NET 简单介绍文件的读写----流类
  6. TCP/IP模型背后的内涵(二)
  7. 笔记本电脑风扇声音大_如果您的笔记本电脑过热或发出声音,则可能需要对风扇进行大修。...
  8. 拓扑排序和关键路径算法----关键路径算法 (C语言实现)
  9. G-Dezender批量解密
  10. 接口可维可测;统一管理
  11. UEFI开发探索50 – UEFI与网络2
  12. 黑灰产攻击洪峰来袭,企业如何守住自己的钱袋子?
  13. MYSQL统一社会信用代码校验函数
  14. 计算机音乐雅俗共赏,“雅俗共赏”与音乐教育
  15. 30个有发展前景的创业项目
  16. uni-app 180查看好友朋友圈完善(一)
  17. 【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕+mpu6050图形控制
  18. 蓝桥杯学习记录-基础练习
  19. bark app在Windows与ios间实现接力
  20. Git泄露 之Stash(做题过程)

热门文章

  1. Oracle11g:分区表数据操作出现ORA-14400异常处理
  2. 闲谈神经网络--写给初学者(三)
  3. 微信公众嵌套页面里再嵌入其他页面的一些问题
  4. 一般用css设置中文字体的Unicode编码
  5. 变成小白的第一本Python入门书,第五章循环与判断课后题答案
  6. C++ 用new 动态创建多维数组
  7. L1-018 大笨钟 (10 分)
  8. 7-166 二分法求多项式单根 (20 分)
  9. 7-189 帅到没朋友 (20 分)
  10. 7-33 出生年 (15 分)