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

java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解) 这里anyMatch表示,判断的条件里,任意一个元素符合条件,就返回true值。在allMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。判断数据列表中全部元素都不符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。判断数据列表中全部元素都符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。 阅读详情

背景介绍

咸鱼君最近做了个需求, 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

unity | 动画模块之滚动选项框 动画模块之滚动选项框 阅读详情

相关推荐

Auto.js凉了之后,我们该用啥?AutoX.js保姆级环境搭建与第一个脚本实战(2024最新)

本文详细介绍了AutoX.js作为Auto.js替代方案的环境搭建与脚本开发实战指南。从技术生态现状分析到2024最新环境配置,再到编写第一个实用脚本和进阶调试技巧,帮助开发者无缝迁移至AutoX.js平台。特别适合需要手机自动化的JavaScript开发者,涵盖从基础到企业级应用的全套解决方案。

weixin_28737073的博客 388

两个List对象,指定属性,取差集、交集。

Stream流方式:取两个List,指定属性,取差集、交集,性能不好。 最好使用Set接口,提高性能。

weixin —> Ryan-0713 1万+

JS自动化生成大疆WPML航线文件实战(附完整代码与云台控制解析)

本文详细介绍了如何利用JavaScript自动化生成大疆WPML航线文件,以解决手动规划航线效率低、易出错的问题。通过解析WPML文件结构,特别是云台控制等核心参数,并封装可复用的JS模板函数,开发者能够快速批量生成复杂航线,如倾斜摄影五向飞行,实现航测与巡检任务的标准化与高效执行。

weixin_29007243的博客 297

高效求两个list的差集

查一个ListA 的每个值(String字符串)在另外一个ListB中是否存在,如果不存在就记录下来。   模拟数据量:100万   方法一: 直接调用list自带的removeAll方法 public static void main(String[] args) throws IOException { List&lt;String&gt; listA =...

zgerbin 1万+

【学习体会】Lighttools8.4.0:矩形阵列光源+条形光源的光学仿真分析

在solidworks中设计了条形光源的基本结构: 由32*6个矩形led组成矩形光源阵列,如下所示 另存为step文件后,导入lighttools中,这里要设置模型的光学属性为:吸收体(机械) 因为我们设计的光源模型是一个整体,我们不能单个面的设置光源,比如说, 这样做的话并不会是这个面设置为光源,而是会把做一个模型都变成一个光源,如下 这显然不是我们想要的 那么,我们就在led位置上放置一个矩形面光源, 这样我们就放置好了一个面光源, 但是问题是,还有191...

LeonJin的博客 1万+

Wi-Fi Sigma测试系统

Wi-Fi Sigma测试系统是Wi-Fi联盟(WFA)提出的一套全自动的WiFi认证测试系统,几乎涵盖的所有Wi-Fi的功能及性能(throughput)的自动化测试。该系统正逐步取代以前的WiFi认证测试系统。

Ke8323的博客 1万+

java获取两个List集合之间的交集、差集、并集

java获取两个List集合之间的交集、差集、并集

weixin_49114503的博客 1万+

LTE信令流程——切换

LTE信令流程 切换 切换是由基站发起的,不同于小区重选,小区重选是由UE发起的。 基站利用移动性管理算法给UE下发测量任务,在RRC重配置消息中携带MeasConfig信元给UE下发测量配置 切换有三种场景: 同一基站内不同小区的切换 不同基站间基于X2的切换(MME不变) 不同基站间基于S1的切换(MME/SGW可能改变) 1. 同一基站内不同小区的切换 连接态的UE在一个基站的不同小区之间移动 UE上报合适的测量报告(Measure Reports),触发基站切换 基站下发切换命令给UE,

Hxx的博客 1万+

java8 list find_java8 多个list对象用lambda求差集操作

业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户。调用接口获取的数据集合list list = response.getdata().getitems();本地查询出来的账户集合list towlist = accountrepository.findall();筛选差集代码list distinctbyuniquelist = list...

weixin_42419508的博客 1211

基于 Verilog 的经典数字电路设计(10)三态门

三态门(Triple-State Gate)亦称 “三态输出门”、“三态门输出电路”,是一种重要的总线接口电路,具有高电平、低电平和高阻抗三种输出状态的门电路,不过我们通常在设计中比较少见。   三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑 1)或低电平(逻辑 0),又可以保持特有的高阻抗状态,高阻态相当于隔断状态(电阻很大,相当于开路)。

新芯设计的博客 1万+

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

A2L文件的生成分为两章讲解:本文主要是讲模型开发,讲解如何把标定量、观测量放到链接文件中的指定位置。下一篇讲解如何使用matlab生成完整的A2L文件

认真搞搞汽车MCU 4614

两个对象List根据属性取交集和差集及并集- 通用plus版

,发现很多小伙伴都有类似的需求, 刚好最近码哥有空了,就着手把之前的简陋方法封装下, 让它更通用些~比对方式可自己定义, 比如多个属性的比对, 老规矩, 给需要的伙伴一个简单的示例, 自行调整。

CTO技术的博客 1464

Unitree G1仿人机器人协同搬箱:从仿真搭建到多机协同部署完整指南

Unitree G1仿人机器人协同搬箱技术方案摘要 本文提供了一套完整的Unitree G1人形机器人协同搬箱解决方案,涵盖从仿真环境搭建到多机协同部署的全流程。核心内容包括: 双仿真环境配置:同时搭建Gazebo+ROS Noetic基础仿真环境与Isaac Gym+Mujoco高性能RL训练环境,支持Sim2Sim迁移验证 训练框架搭建:详细配置unitree_rl_gym框架,提供PPO算法定制化训练流程和参数优化方案 数据集应用:整合宇树开源真机数据集(UnifoLM-WBT-Dataset)~~~

huanghm88的专栏 471

Java使用Stream求对象集合的交集、差集详解

Java 8使用Stream和Lambda表达式求对象集合的交集、差集

Knight of Zero 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java8中list相关的交集,并集,差集以及去重(String,对象属性去重)

交集,并集,差集: import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Strin...

WWXA 5163

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java8 两个List集合取交集、并集、差集

啦啦啦 你是我一首唱不完的歌

weixin_42272558的博客 8514

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java8获取两个list的交集和差集_java8两个集合取交集、并集与差集

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如...

weixin_39927288的博客 1364

两个List取交集 差集

java8stream流式操作后续常用的还会补充。

qq_40794453的博客 508

java8获取两个list的交集和差集_java8 多个list对象用lambda求差集操作

业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户。jat免费资源网调用接口获取的数据集合jat免费资源网List list = response.getData().getItems();jat免费资源网本地查询出来的账户集合jat免费资源网List towList = accountRepository.findAll();jat免费资...

weixin_39854369的博客 2690

java8List 元素对象单字段去重 多字段去重 交集 差集 多字段排序

1.排序;2.list 转成 map;3. list 去重;4.list根据对象某一字段值去重;5.list多属性去重 ;6.list 取交; 7.获取元素对象属性值集合;8.List 根据Bean的一个属性求两个list的交集 差集;9.list 和 List 取差集;10.list 获取元素对象单属性值重复的字段数据 返回String;11.list 获取元素对象多属性值重复的字段数据 返回String;12.list 条件过滤;13.多字段排

qq_34690003的博客 4525

Java8的Stream根据Bean中的某一个属性,就两个List< Bean>的交集差集

Stream根据Bean中的某一个属性,就两个List< Bean>的交集差集 import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * @author liweifang * @desc * @date 2021-03-11 11:39 */ class Student { private Integer age; private Str

weixin_37134286的博客 1614

两个List对象多属性去重、交集、差集

两个List对象多属性去重、交集、差集 public class Test { public static void main(String[] args) { People people1 = new People("admin","1","14"); People people2 = new People("admin","2","11"); People people5 = new People("zhangsan","1","11");

会走路的蜗牛 890

java 快速取出两个list中实体某个属性值相同的实体和不同的实体

引言:在项目的开发过程中经常要用到list的结构,如何快速的提取出list<实体>中属性的值相同的实体和不同的实体呢? 1、简单的List做交集和差集和并集 先定义两个list: List<String> list1 = new ArrayList<>(); list1.add("1"); list1.add("2"); List<String&g...

qq_35531784的博客 1万+

java8集合操作(排序、取交集、并集、差集、去重并集)分组

System.out.println("---差集 reduce1 (list1 - list2)---");System.out.println("---差集 reduce2 (list2 - list1)---");System.out.println("---并集 listAll---");System.out.println("---原来的List1---");System.out.println("---原来的List2---");// 差集 (list1 - list2)// 交集 取相等的。

weixin_42405132的博客 4057

stream流操作List对象,指定属性,取差集、交集

【代码】stream流操作List对象,指定属性,取差集、交集。

记录,交流,共同进步 1762
上一篇: 38. SpringBoot通用开发框架
下一篇: 几段代码,带你理解RPC
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值