业务场景:

  页面左右两个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两个集体交集、差集、并集操作的更多相关文章

  1. sqlite支持各种交集差集 并集操作了

  2. C# 集合的交集 差集 并集 去重

    C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...

  3. python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)

    # ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...

  4. js取两个数组的交集|差集|并集|补集|去重示例代码

    http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...

  5. python两个 list 交集,并集,差集的方法+两个tuple比较操作+两个set的交集,并集,差集操作+两个dict的比较操作

    转自:http://blog.chinaunix.net/uid-200142-id-3992553.html 有时候,为了需求,需要统计两个 list 之间的交集,并集,差集.查询了一些资料,现在总 ...

  6. java 交集 差集 并集

    package com.wish.datastrustudy; import java.util.HashSet; import java.util.LinkedList; import java.u ...

  7. C# 数组比较--取得两个集合的交集,差集,并集的方法

    方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...

  8. [转]list的交集,差集,并集

    原文地址:https://www.cnblogs.com/changfanchangle/p/8966860.html 工作中用到了list的取差集,发现还是挺好用的.所以记录下. 需求 list的方 ...

  9. javascript 数组求交集/差集/并集/过滤重复

    最近在小一个小程序项目,突然发现 javscript 对数组支持不是很好,连这些基本的功能,都还要自己封装.网上查了下,再结合自己的想法,封装了一下,代码如下. //数组交集 Array.protot ...

随机推荐

  1. 深度优先dfs与广度bfs优先搜索总结+例题

    DFS(Deep First Search)深度优先搜索 深度优先遍历(dfs)是对一个连通图进行遍历的算法.它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节 ...

  2. CSRF利用

    使用burpsuite的csrf poc选项,可以生成HTML代码 json CSRF flash + 307跳转 https://github.com/sp1d3r/swf_json_csrf

  3. 02.02 lamp环境搭建笔记

    lamp环境 在linux中安装 apache.mysql.php三种软件环境,同时需要安装他 某些插件. cp /etc/apt/sources.list /etc/apt/sources.list ...

  4. Python学习笔记——pickle 模块

    由于从文本文件中读取出来的内容都会变成字符串,且转换成列表.字典等数据类型比较困难,因此采用pickle模块存储它们 import pickle my_list = [123,3.14,'小甲鱼',[ ...

  5. [CF1146D]Frog Jumping_exgcd_堆优化dij

    Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...

  6. python字典改变value值方法总结

    今天这篇文章中我们来了解一下python之中的字典,在这文章之中我会对python字典修改进行说明,以及举例说明如何修改python字典内的值.我们开始进入文章吧. 首先我们得知道什么是修改字典 修改 ...

  7. Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散 ...

  8. PostgreSQL-存储过程

    存储过程其实就是函数,由一组 sql 语句组成,实现比较复杂的数据库操作: 存储过程 是 存储在 数据库服务器 上的,用户可以像调用 sql 自带函数一样 调用存储过程 语法解析 CREATE [OR ...

  9. 植物大战僵尸:查找植物叠加种植CALL

    实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物. 我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间 ...

  10. Java多线程(十一):线程组

    线程组 线程组可以批量管理线程和线程组对象. 一级关联 例子如下,建立一级关联. public class MyThread43 implements Runnable{ public void ru ...