两个对象List根据属性取交集和差集

article/2025/10/25 16:02:14

背景介绍

咸鱼君最近做了个需求, excel导入功能,

其中

需要对已导入条目的做“更新”

未导入的条目做“新增”

其余的做“删除”

细品需求

无非是对excel的数据和数据库的数组做个差集, 交集的处理

打个比方:

excel的数据我们定义为 newList

已导入的数据我们定义为 existList

那么

  • newList 和 existList 的交集 就是 更新的数据

  • newList - existList 的差集 就是 新增的数据

  • existList - newList 的差集 就是 删除的数据

不难看出, 这边就需要两个方法

一个是求交集

另一个就是求差集

此时, 很多人for, foreach的思维开始了…………

收起你过时的想法!

jdk8都更新了stream流操作和lamba表达式,你居然还想要for这种操作?!

你难道自信自己写的方法比stream高效安全?!

下面, 我们就介绍下stream()和lamba表达式结合来处理差集交集的操作

定义Excel实体

excel中每行记录都是人的数据, 所以我们定义一个实体

class People{//姓名private name;//身份证private code;
}

业务比对

我们定义了People实体可以看出身份证是唯一的所以我们比对数据时可以用code这个属性来比较那么对应的业务需求可以描述成这样

List<People> existPeopleList = 查询数据库;
List<People> newPeopleList  = excel读取的新数据
//需要更新的数据,参数顺序注意
List<People> updateProple = sameList(existPeopleList, newPeopleList); 
//需要删除的数据
List<People> delList = diffList(existPeopleList, newPeopleList); 
//需要新增的数据
List<People> inserList = diffList(newPeopleList, existPeopleList);

这边注意

sameList(existPeopleList,newPeopleList))参数的顺序很重要

打个比方:

existPeopleList中有个 code 为1 的 name 为1;

newPeopleList中有个 code 为1 的 name 为11;

传参顺序将决定返回的是1还是11!

这里具体看大家的业务是什么!(事实上,更新肯定是以excel的数据为准)

下面我们正式介绍sameList()和diffList()的实现

求两个对象List的交集

private List<People> sameList(List<People> oldArrayList, List<People> newArrayList) {List<People> resultList = newArrayList.stream().filter(item -> oldArrayList.stream().map(e -> e.getCode()).collect(Collectors.toList()).contains(item.getCode())).collect(Collectors.toList());return resultList;}

求两个对象List的差集

private List<People> diffList(List<People> firstArrayList, List<People> secondArrayList) {List<People> resultList = firstArrayList.stream().filter(item -> !secondArrayList.stream().map(e -> e.getCode()).collect(Collectors.toList()).contains(item.getCode())).collect(Collectors.toList());return resultList;
​    }

求两个对象List的差集(多属性比对)

比对的时候我们需要的可能不止一个参数

所以,咸鱼君列出一个通用的多属性比对求差集的方法

比如我们需要code和name两个属性才能比对则

e -> e.getCode() + "&" + e.getName()

再比如还需要个加age属性

e -> e.getCode() + "&" + e.getName()+ "&" +e.getAge();

依此类推

private List<People> diffList(List<People> firstArrayList, List<People> secondArrayList) {List<People> resultList = firstArrayList.stream().filter(item -> !secondArrayList.stream().map(e -> e.getCode() + "&" + e.getName()).collect(Collectors.toList()).contains(item.getCode() + "&" + item.getName())).collect(Collectors.toList());return resultList;}

补充(多属性异同比对)

举个列子, 两个属性比对,求出属性1相同,且属性2不同的交集
我们可以分步求解, 先找到属性1相同的,在此基础上找到属性2不同的即可.

灵活使用filter

    private List<People> diffList(List<People> firstArrayList, List<People> secondArrayList) {List<People> resultList = firstArrayList.stream().filter(item -> secondArrayList.stream().map(e -> e.getCode()).collect(Collectors.toList()).contains(item.getCode())).filter(item -> !secondArrayList.stream().map(e -> e.getName()).collect(Collectors.toList()).contains(item.getName())).collect(Collectors.toList());return resultList;}

最后

Stream()结合Lamba表达式可以做很多事

数据过滤, 筛选, 分组, 聚合等等

大家可以多多学习~

请关注我的订阅号

订阅号.png


http://chatgpt.dhexx.cn/article/DKKFtTw9.shtml

相关文章

java8 Stream流 两个list取交集,获取共有数据

代码&#xff1a; public static void main(String[] args) {List<String> list1 Arrays.asList("a","b","c");List<String> list2 Arrays.asList("b","c","d");List<String> intersection …

Java-两个较大的List快速取交集、差集

工作中经常遇到需要取两个集合之间的交集、差集情况&#xff0c;但是普通的retainAll()和removeAll()无法满足数据量大的情况&#xff0c;由此就自己尝试运用其他的方法解决。注&#xff1a;如果数据量小的情况下&#xff0c;还是使用retainAll()和removeAll()方便 1.假使不存在…

java中两个list对象取交集、差集

在一般操作中&#xff0c;对于list集合取交集、差集、并集&#xff0c;比较简单&#xff0c;网上有很多例子&#xff0c;如&#xff1a; 今天我们来说一下对于两个list集合该如何取交集与并集&#xff1a; 如下两个集合&#xff1a;groupEntityList、saveEntities&#xff0c;…

两个 list 求交集

两个 list 求交集, 一种方式是手动遍历, 然后判断是否 contains, 然后添加到结果 list 中 这里介绍另外一个方法 直接调用 list1.retainAll(list2), 调用完成后, list1 中不在 list2 的元素都会被剔除, 此时 list1 就是交集 /*** retain* 保留*/Testpublic void testRetain() …

部署Kubernetes Dashboard 及监控组件 Heapster

部署Dashboard 项目地址&#xff1a;https://github.com/kubernetes/dashboard 1.下载官方提供的 Dashboard 组件部署的 yaml 文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml也可以使用Kuber…

heap类型

重点思想&#xff1a; 第一轮从k个list中拿出第一个&#xff08;若每个list非空的话&#xff1b;有可能为空&#xff09;放入minheap中&#xff0c;minheap一直储存k个lists中最小的那个数&#xff0c;对顶代表当前最小的数&#xff0c;需要插入result listnode。所有list每个n…

Python heap

原文&#xff1a;https://blog.csdn.net/dta0502/article/details/80834787 堆是一类特殊的树&#xff0c;堆的通用特点就是父节点会大于或小于所有子节点&#xff08;儿子不分左右&#xff09;。一个最小堆&#xff08;min-heap&#xff09;就是其中的每一个节点都小于或等于…

Stack and Heap

JVM 分配内存进入以下区域 1&#xff1a; Heap 2&#xff1a;Stack 3&#xff1a;Code 4&#xff1a;Static jvm有效的管理分配到这几个内存区域。 Code section 代码区 包含这个 字节码文件 (byte code) Stack section (栈区域) 包含 方法&#xff08;methods&a…

堆-heap

priority queue可以借用堆&#xff08;heap&#xff09;,binary heap是一种complete binary tree(完全二叉树&#xff09; 完全二叉树&#xff1a;binary tree除最底层叶节点之外&#xff0c;是填满&#xff0c;最底层叶节点由左到右不得有空隙。 用vector来存储所有节点&…

Kubernetes安装系列之heapster安装

虽然heapster已经即将退休&#xff0c;为了纪念一下&#xff0c;这篇文章整理一下heapstergrafanaInfluxdb组合对于kubernetes的node与资源进行监控的插件安装与设定方法&#xff0c;本文以脚本的方式进行固化&#xff0c;内容仍然放在github的easypack上。 整体操作 https:/…

Heapster -- Kubernetes Dashboard集成Heapster

原始kubernetes dashboard的界面中仅显示了pod一些配置信息&#xff0c;无法图形化展现集群度量指标信息。原始图如下&#xff08;此处从网上找了一个图..&#xff09;&#xff1a; 而如果要展示图形化的集群度量指标信息&#xff0c;就需要安装一个dashboard插件&#xff1a;h…

HeapSort

堆的定义&#xff1a; n个关键字序列K[1....n]称为堆&#xff0c;当且仅当改序列满足&#xff1a; 第一种为&#xff1a;小根堆&#xff1a;每个结点的值都小于或等于左右孩子结点 第二种为&#xff1a;大根堆&#xff1a;每个结点的值都大于或等于左右孩子结点 堆是一种完全二…

heap.h

上一篇写了写链表&#xff0c;这篇写下堆&#xff0c;这个结构接触的不多&#xff0c;所以正好学习一下libhv中的堆&#xff0c;这个堆的实现比较灵活&#xff0c;即可以是大顶堆也可以是小顶堆&#xff0c;通过比较函数是比大还是比小来区别&#xff0c;当然&#xff0c;如果没…

部署 heapster 插件

说明&#xff1a;本部署文章参照了 https://github.com/opsnull/follow-me-install-kubernetes-cluster &#xff0c;欢迎给作者star Heapster是一个收集者&#xff0c;将每个Node上的cAdvisor的数据进行汇总&#xff0c;然后导到第三方工具(如InfluxDB)。 Heapster 是通过调用…

每天5分钟玩转Kubernetes | Heapster

书籍来源&#xff1a;cloudman《每天5分钟玩转Kubernetes》 一边学习一边整理老师的课程内容及试验笔记&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;每天5分钟玩转Kubernetes | 汇总_COCOgsta的博客-CSDN博客 Heap…

Kubernetes监控Heapster介绍

什么是Heapster&#xff1f; Heapster是容器集群监控和性能分析工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有个出名的监控agent—cAdvisor。在每个kubernetes Node上都会运行cAdvisor&#xff0c;它会收集本机以及容器的监控数据(cpu,memory,filesystem,netw…

nginx部署https域名

目录 一、准备工作 二、部署项目 三、修改nginx的配置文件 一、准备工作 1、首先你要有一台服务器&#xff0c;本篇文章是创建在腾讯云服务器的基础上的&#xff0c;仅供参考 2、在服务器上注册域名&#xff0c;这个域名注册等待审核时间较长&#xff0c;建议提早注册&…

域名解析与nginx配置

dns解析 阿里云服务器dns域名解析配置&#xff0c;记录值就是阿里云服务器的ip nginx配置 远程到阿里云服务器上对nginx进行配置&#xff1a; nginx反向代理配置&#xff1a; 修改配置后&#xff0c;重启nginx服务 进入目录&#xff1a;cd /usr/sbin 强制杀死进程&#xff…

linux nginx部署项目配置域名

一.把项目打包&#xff08;jar&#xff09; 二.把jar包通过xshell上传 三.编辑nginx.conf文件&#xff0c;配置域名&#xff0c;每配置一个域名就复制一份里面的server 1 代表你所要配置的域名 2 代表你项目浏览器访问路径 四.在项目上传的目录下&#xff08;jar包所放的位…

Docker部署nginx、配置域名

文章目录 背景1. 拉取nginx镜像2. 启动nginx3. 通过docker修改nginx配置1) 挂载配置文件2) 重新加载配置文件 4. 配置我的域名小结 背景 docker 容器相关技术已经成为了现在开发和运维人员的热门技术之一&#xff0c;docker就像一个集装箱能够将各种应用放入到集装箱里的盒子里…