java8 stream两个集体交集、差集、并集操作
业务场景:
页面左右两个datagrid,双击左边datagrid行,移动到右边datagrid,右边datagrid行双击,移动到左边datagrid
点击保存,提交修改的数据到后台
后台要把查询到的数据,和这次提交的数据对比,不变的不动,有新添加的,要增加,有去掉的要执行删除操作
注:不能统一删除,再全新增,原来已经存在的信息可以做了一些配置,全删除,再全插入,原来的配置会丢了。
那就要后台对两个集合进行对比。
为了方便理解,搞点简单数据举个栗子:
已经存在的集合:info : ['A' ,'B' ,'C' ,'D' , 'E', 'F']
本次提交的集合:list : ['A' ,'B' ,'C' ,'D' , 'G', 'H']
//0. list是前台参数传递进来的右边datagrid数据。
List<TbBaseinfo> list
//1.根据该业务系统已经导入的表集合,和本次保存的集合,求差集
List<TbBaseinfo> info = tbBaseinfoMapper.selectList(new QueryWrapper<TbBaseinfo>().eq("project_id", projectId)); //数据库中已存在的数据
//注意:求差集------------A和B,差集,B和A差集,合在一起去重,才是整个差集
//我这里页面传递的对象,页面操作做过修改,对象有的字段被修改了,对象并不完全相等,要用id来判断,是否是同一个对象
List<TbBaseinfo> differenceSet1 = info.stream().filter(item -> !list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//已有数据和提交数据的差集,得到差集['E', 'F']
List<TbBaseinfo> differenceSet2 = list.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//提交数据和已有数据的差集,得到差集['G', 'H']
List<TbBaseinfo> differenceSet = new ArrayList<TbBaseinfo>(differenceSet1);
differenceSet.addAll(differenceSet2);//两个差集合并在一起
differenceSet = differenceSet.stream().distinct().collect(Collectors.toList());//合并后的差集去重 [ 'E', 'F' ,'G', 'H' ]
//2.已经存在的集合,和本次提交的集合,求交集
List<TbBaseinfo> intersection = info.stream().filter(item -> list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList()); //得到交集:['A' ,'B' ,'C' ,'D']
//3.本次保存的集合,和交集,的差集
List<TbBaseinfo> allDifferenceSet1 = info.stream().filter(item -> !intersection.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['A' ,'B' ,'C' ,'D' , 'G', 'H']和 ['A' ,'B' ,'C' ,'D']的差集,得到差集:['G', 'H']
List<TbBaseinfo> allDifferenceSet2 = intersection.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['A' ,'B' ,'C' ,'D']和 ['A' ,'B' ,'C' ,'D' , 'G', 'H']的差集,得到差集:[]
List<TbBaseinfo> allDifferenceSet = new ArrayList<EcBaseinfo>(allDifferenceSet1);
allDifferenceSet.addAll(allDifferenceSet2); //合并差集为:['G', 'H']
allDifferenceSet = allDifferenceSet.stream().distinct().collect(Collectors.toList()); //去重还是['G', 'H']
List<TbBaseinfo> allDifference = allDifferenceSet;
//4.最终的差集,和第一次的差集,的交集,即是要添加的,差集即是要删除的
List<TbBaseinfo> addList = differenceSet.stream().filter(item -> !allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['G', 'H']和[ 'E', 'F' ,'G', 'H' ]的交集:['G', 'H'],即是要添加的,插入
List<TbBaseinfo> delList = differenceSet.stream().filter(item -> allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['G', 'H']和[ 'E', 'F' ,'G', 'H' ]的差集:['E', 'F'],即是要删除的
//5.删除
delList.forEach(item->{
String id = item.getId();
String tableName = item.getTable_name();
tbBaseinfoMapper.deleteById(id);
String sql="DROP TABLE IF EXISTS "+tableName;
jdbcUtil.executeSql(sql);
});
//6.插入
for(TbBaseinfo obj:addList) {
tbBaseinfoMapper.insert(obj);
}
}
java8 stream两个集体交集、差集、并集操作的更多相关文章
- sqlite支持各种交集差集 并集操作了
- C# 集合的交集 差集 并集 去重
C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...
- python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)
# ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...
- js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
- python两个 list 交集,并集,差集的方法+两个tuple比较操作+两个set的交集,并集,差集操作+两个dict的比较操作
转自:http://blog.chinaunix.net/uid-200142-id-3992553.html 有时候,为了需求,需要统计两个 list 之间的交集,并集,差集.查询了一些资料,现在总 ...
- java 交集 差集 并集
package com.wish.datastrustudy; import java.util.HashSet; import java.util.LinkedList; import java.u ...
- C# 数组比较--取得两个集合的交集,差集,并集的方法
方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...
- [转]list的交集,差集,并集
原文地址:https://www.cnblogs.com/changfanchangle/p/8966860.html 工作中用到了list的取差集,发现还是挺好用的.所以记录下. 需求 list的方 ...
- javascript 数组求交集/差集/并集/过滤重复
最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...
随机推荐
- Odoo13 新变化:会计
Odoo13将于2019年10月发布,本次发布也包含了大量的改进,例如,对会计的重构. 去掉了 account.invoice / account.invoice.line/ account.vouc ...
- idea配置git的步骤
第一次git到GitHub过程 打开到项目 这样就不用再用git Bash敲命令了
- python进程池 使用Queue实现计数功能
多进程中各个进程间相互隔离,进程间通信需要使用到通道. 多进程中使用Queue实现进程中通信 from multiprocessing import Process,Queue import time ...
- 一个基于Unix套接字的注册登录系统
2016/5/5 今天,我参考<Unix网络编程-卷1>第5章的TCP回射客户/服务器程序写了一个简单的注册登录系统,其功能如下:(1)注册.客户端向服务器发送个人信息请求注册,服务器查询 ...
- Git Bash输错账号密码如何重新输入
很多时候我们容易在Git Bash操作的时候,不慎输入错误的用户名或密码,此时一直提示: remote: Incorrect username or password ( access token ) ...
- 【AtCoder】ARC061
ARC061 C - たくさんの数式 / Many Formulas 这个其实\(10^5\)也能做.. 就是\(dp[i]\)表示到第i位的方案数,\(sum[i]\)表示延伸到第i位之前的所有方案 ...
- 笔记-4:python组合数据类型
1.字符串(str) 字符串是字符的序列表示, 根据字符串的内容多少分为单行字符串和多行字符串. 单行字符串可以由一对单引号(') 或双引号(")作为边界来表示, 单引号和双引号作用相同. ...
- S02_CH01_Hello World实验
S02_CH01_Hello World实验 ZYNQ是一款SOC芯片,在前面第一季的学习当中,我们只是粗略的学习了ZYNQ的PL部分,对于ZYNQ最突出的功能,其内部的双核Cortex-A9内核并未 ...
- 怎样理解 display:none 和 visibility:hidden
1. display: none会使元素节点 "消失" , 就像 死亡后灰飞烟灭了. 它是不占位置的. 2. visibility: hidden会使元素节点 "隐藏&q ...
- hdu 6140 思维
题解:这道题中的数能组成的数构成了一个连续区间. 一开始只有 a1 的时候能够构成 [-1, 1][−1,1] 中的所有整数. 如果一堆数能够构成 [-a, b][−a,b] 中的所有整数, 这时 ...