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);
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM