zoukankan      html  css  js  c++  java
  • 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);
    }
    }

  • 相关阅读:
    recon-ng打开后显示No modules enabled/installed
    mysql的floor()报错注入方法详细分析
    视频合并时使用python批量修改文件名
    ThinkPHP5框架引入的css等外部资源文件没有生效
    用session实现的用户登陆,客户端是怎样获取到cookie信息的
    关于Linux系统下基于Tomcat部署和升级war包的详细过程
    nginx代理的页面性能优化大全
    linux下MySQL数据库的定时备份与定时删除
    关于linux查询内存,CPU,存储空间和日志查询的的常用命令及参数讲解
    linux 查看cpu核心数
  • 原文地址:https://www.cnblogs.com/ngy0217/p/11810103.html
Copyright © 2011-2022 走看看