背景介绍

咸鱼君最近做了个需求, 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表达式可以做很多事

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

大家可以多多学习~

请关注我的订阅号

两个对象List根据属性取交集和差集相关推荐

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

    在一般操作中,对于list集合取交集.差集.并集,比较简单,网上有很多例子,如: 今天我们来说一下对于两个list集合该如何取交集与并集: 如下两个集合:groupEntityList.saveEnt ...

  2. Java:比较两个对象中全部属性值是否相等

    点击关注公众号,实用技术文章及时了解 来源:xiaoer.blog.csdn.net/article/details/85005295 例如下述Java类: import java.io.Serial ...

  3. jdk8两个List取交集、差集、并集(不去重)、并集(去重)

    jdk8两个List取交集.差集.并集(不去重).并集(去重) /*** 交集* @param list1* @param list2* @return*/private static List< ...

  4. 【Java】对两个Set取交集,差集,并集

    1.取交集(取两个集合中都存在的元素) HashSet<String> setA = new HashSet<>(); HashSet<String> setB = ...

  5. oracle数据库 交集,Oracle两个逗号分割的字符串,获取交集、差集(sql实现过程解析)...

    Oracle数据库的两个字段值为逗号分割的字符串,例如:字段A值为"1,2,3,5",字段B为"2". 想获取两个字段的交集(相同值)2,获取两个字段的差集(差 ...

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

    工作中经常遇到需要取两个集合之间的交集.差集情况,但是普通的retainAll()和removeAll()无法满足数据量大的情况,由此就自己尝试运用其他的方法解决.注:如果数据量小的情况下,还是使用r ...

  7. 两个不同对象的list要取交集(list转map的应用)

    前提说明 当前有两个实体类,LinePort为航线港口中间表实体,存有到港时间,出港时间,航线id和港口id,Port为港口信息表,现在前端需要将两个查询到的实体信息list,List和List通过p ...

  8. ORAClE 两个表取交集,并集,差集

    这是我盗的 selct A.* from A UNION ALL/UNION/Intersect/MINUS select B.* from B; UNION ALL ---------------- ...

  9. 比较两个对象中全部属性值是否相等

    重写Bean_Topology的equals方法和hashcode方法 @Override public boolean equals(Object obj) {if (this == obj) {r ...

最新文章

  1. WINRAR 命令行语法
  2. Debian 8 直接升级到 Debian 9
  3. 从Java到Kotlin(五)
  4. c语言程序的标识符分类,华中科技大学计算机学院C语言程序设计标识符.PPT
  5. extjs学习(关于grid)
  6. CentOS 初体验五: SSH远程连接
  7. Spring Boot2.0+中,自定义配置类扩展springMVC的功能
  8. 怎么判断tcp重组完成_网络工程师(8):TCP为什么可靠
  9. Eigen教程(10)之混淆
  10. java 实例域_Java实例域初始化
  11. ios mysql注册登录界面_iOS学习2:创建属于自己的页面,自定义初始界面
  12. 不确定度在线计算_计量测量的不确定度详解
  13. 破解wifi时遇到rtl8187 - [phy1]SIOCSIFFLAGS: Name not unique on network
  14. python吃显卡还是内存条_内存条与显卡金手指氧化了解决方法
  15. Nuvoton M0518 之 记录数据到LDROM,数据掉电不丢失的方式
  16. 【富文本】如何设置U盘为第一启动项,在安装windows操作系统时如何从U盘启动?
  17. html样式在ie显示不全,IE下css常见问题总结及解决
  18. Anchor和目标检测中的理论感受野和实际感受野的关系
  19. 阿里的花名,是要抹去员工独立人格?
  20. 2023年中职网络安全竞赛解析——隐藏信息探索

热门文章

  1. Ubuntu下配置VS Code C++ 环境
  2. 朗逸发动机型号css和ea211的区别,css发动机和ea211发动机有什么区别
  3. 利用Intent.ACTION_SEND进行分享
  4. MYSQL对应版本的jar包
  5. Win7网络共享看不见计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...
  6. cookie、session、token理解
  7. 聚划算客户端2期总结
  8. python自动录入系统_自动化批量录入Web系统
  9. 安装KB3132372补丁后,WIN10中IE内核加载flash崩溃
  10. vue2引入Element UI的详细步骤