高级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<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 - 利用函数式接口实现通用的取并集/交集/差集进阶版相关推荐
- 高级JAVA - 利用函数式接口实现通用的取并集/交集/差集
package com.xing.dto;import com.xing.common.utils.XDataUtil; import lombok.Data;import java.util.Arr ...
- 学习 Java 8 - 函数式接口 Lambda
学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...
- java中函数式接口的使用
java中函数式接口的使用 一.自己创建的函数式接口 1.1 概念 只存在一个抽象方法的接口. 1.2 使用步骤: 1.创建函数式接口,创建格式参照使用格式. 2.创建一个实例类 3.在实例类中使用函 ...
- Java之函数式接口(FunctionalInterface)
Java之函数式接口(FunctionalInterface) 1. FunctionalInterface是什么? FunctionalInterface 中文称之为 函数式接口.是Java新特性之 ...
- 【java】函数式接口和Stream
函数式接口和Stream 函数式接口和Stream 1. 函数式接口 1.1 函数式接口概述 1.2 常用函数式接口 1.3 比较器函数式接口 1.4 消费函数式接口 Consumer 1.5 生产者 ...
- Java四大函数式接口
Java8函数式接口 1. Consumer<T> 消费型接口 2. Supplier <R> 供给型接口 3. Function<T, R> 函数型接口 4. P ...
- 【Java】函数式接口与Lambda表达式
函数式接口--@FunctionalInterface Code @FunctionalInterface interface IService {void say(String message); ...
- java自定义函数式接口
⾃定义lambda接⼝流程 定义⼀个函数式接⼝ 需要标注此接⼝ @FunctionalInterface,否则万⼀团队成员在接⼝上加 了其他⽅法则容易出故障 编写⼀个⽅法,输⼊需要操做的数据和接⼝ 在 ...
- java 8 函数式接口_必看:通俗易懂地告诉你什么是java8中的“函数式接口”
花10分钟认真的看完一篇文章,或许会有意想不到的收获 java8发布已经好几年了,相信很多小伙伴都使用过java8,java8这版本带来了很多新特性,其中一个就是"函数式接口",今 ...
最新文章
- 2015前端生态发展回顾(转)
- 为什么 ++[[]][+[]]+[+[]] = 10 ?
- .net语言_小白对入门语言的选择,C、C++、Java、Python、.NET该怎么选?
- git_day03_01——git远程仓库的使用
- VB.NET 读写HTML 文件,VB.NET 简单介绍文件的读写----流类
- TCP/IP模型背后的内涵(二)
- 笔记本电脑风扇声音大_如果您的笔记本电脑过热或发出声音,则可能需要对风扇进行大修。...
- 拓扑排序和关键路径算法----关键路径算法 (C语言实现)
- G-Dezender批量解密
- 接口可维可测;统一管理
- UEFI开发探索50 – UEFI与网络2
- 黑灰产攻击洪峰来袭,企业如何守住自己的钱袋子?
- MYSQL统一社会信用代码校验函数
- 计算机音乐雅俗共赏,“雅俗共赏”与音乐教育
- 30个有发展前景的创业项目
- uni-app 180查看好友朋友圈完善(一)
- 【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕+mpu6050图形控制
- 蓝桥杯学习记录-基础练习
- bark app在Windows与ios间实现接力
- Git泄露 之Stash(做题过程)