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 ...
随机推荐
- 【MOOC课程学习记录】数据结构
看了中国大学MOOC zju的<数据结构>2019夏的第九次开课.做了一些PTA上的习题,没有全做,因为做得慢,老是不会,加上并不能做到一有空就学习,所以做不完了,给跪了Orz. 以后有时 ...
- innodb事务锁的一些常见数据结构
lock_sys_t 整个innodb的锁系统管理结构体,定义在lock0lock.h中.在lock0lock.cc中有一个lock_sys_t的全局指针lock_sys, 由lock_sys_cre ...
- IOI 2005/bzoj 1812:riv 河流
Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一 ...
- ubuntu/debian将sh改为bash
1. 查看现在环境 可以看到,现在的默认环境是sh.我们想把它变为bash,可以这样做: 2. 运行sudo dpkg-reconfigure dash,出现以下画面: 这里提示我们是否要用默认的s ...
- input输入框内容变化实时监听
js实现的文本框内容发生改变立马触发事件简单介绍:本章节介绍一下如何在文本框的内容发生变化的时候,立马触发一个事件执行响应的操作,而不是像是keydown或者keyup事件一样,只能够检测通过键盘输入 ...
- docker中启动2个mysql实列
一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...
- Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...
- KMP算法最浅显理解——一看就明白
https://blog.csdn.net/starstar1992/article/details/54913261 说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里 ...
- @WebServlet注解
@WebServlet("/LoginServlet") jsp页面: <form action="LoginServlet" method = &quo ...
- C程序设计语言练习 第三章
3.3 else-if语句 折半查找,这里通过一个折半查找说明三路判定程序的用法.该函数用于判定已排序好的数组v中是否存在某个特定的值.数组v的元素必须以升序排列.如果v中包含x,则该函数返回x在v中 ...