sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

两个List集合取交集、并集、差集

业务场景:根据用户查询权限,入参:UserCode,lastQueryTime(上次查询时间),出参:权限变化的列表。
oldList(上次查询到的权限列表),currList(当前查询到的权限列表),比对两个list找出:移除和增加的权限加以标识(1--增加,-1--删除)返回。
原逻辑处理方法:循环currList,如果oldList中不包含即为增加的权限列表,反之,循环oldList,如果currList中不包含即为移除的权限列表,代码如下(简略写没运行,比较笨拙):

  1. //之前写的已经删了手动打下(add处有问题应该用map,将就着看吧)
  2. List<String> removeList =new ArrayList<String>();
  3. List<String> addList =new ArrayList<String>();
  4. for(String old:currList){
  5. if(!currList.contains(old)){
  6. removeList.add(old,"-1")
  7. }
  8. }
  9. for(String curr:oldList){
  10. if(!oldList.contains(curr)){
  11. addList.add(curr,"1")
  12. }
  13. }

用Java8中的 lambda表达式处理:

  1. //AppAuths返回的变化列表
  2. // 移除权限:上次与当前的权限取差集 (oldAppPrivileges - currAppPrivileges)
  3. List<AppPrivilege> removePrivileges = oldAppPrivileges.stream()
  4. .filter(oldPrivilege ->!currAppPrivileges.contains(oldPrivilege)).collect(toList());
  5. removePrivileges.parallelStream().forEachOrdered(removePrivilege ->
  6. appAuths.add(new AppAuths(removePrivilege, "-1")));
  7. // 增加权限:当前与上次的权限取差集 (currAppPrivileges - oldAppPrivileges)
  8. List<AppPrivilege> addPrivileges = currAppPrivileges.stream()
  9. .filter(currPrivilege ->!oldAppPrivileges.contains(currPrivilege)).collect(toList());
  10. addPrivileges.parallelStream().forEachOrdered(addPrivilege ->
  11. appAuths.add(new AppAuths(addPrivilege, "1")));

逻辑其实是一样的,但下面的代码会给人一种高级的感觉(个人认为),性能方面下面的要好很多。
下面是:两个List集合取交集、并集、差集、去重并集的一个简单Demo,可供参考:

  1. package com.ymdd.galaxy.appmanage.core.appauth.service;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import static java.util.stream.Collectors.toList;
  5. public class Test {
  6. public static void main(String[] args) {
  7. List<String> list1 = new ArrayList<String>();
  8. list1.add("1");
  9. list1.add("2");
  10. list1.add("3");
  11. list1.add("5");
  12. list1.add("6");
  13. List<String> list2 = new ArrayList<String>();
  14. list2.add("2");
  15. list2.add("3");
  16. list2.add("7");
  17. list2.add("8");
  18. // 交集
  19. List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
  20. System.out.println("---交集 intersection---");
  21. intersection.parallelStream().forEach(System.out :: println);
  22. // 差集 (list1 - list2)
  23. List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
  24. System.out.println("---差集 reduce1 (list1 - list2)---");
  25. reduce1.parallelStream().forEach(System.out :: println);
  26. // 差集 (list2 - list1)
  27. List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
  28. System.out.println("---差集 reduce2 (list2 - list1)---");
  29. reduce2.parallelStream().forEach(System.out :: println);
  30. // 并集
  31. List<String> listAll = list1.parallelStream().collect(toList());
  32. List<String> listAll2 = list2.parallelStream().collect(toList());
  33. listAll.addAll(listAll2);
  34. System.out.println("---并集 listAll---");
  35. listAll.parallelStream().forEachOrdered(System.out :: println);
  36. // 去重并集
  37. List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
  38. System.out.println("---得到去重并集 listAllDistinct---");
  39. listAllDistinct.parallelStream().forEachOrdered(System.out :: println);
  40. System.out.println("---原来的List1---");
  41. list1.parallelStream().forEachOrdered(System.out :: println);
  42. System.out.println("---原来的List2---");
  43. list2.parallelStream().forEachOrdered(System.out :: println);
  44. }
  45. }

————————————————
本文转载自CSDN博客
原文链接:https://blog.csdn.net/weixin_38256991/article/details/81672235

https://blog.csdn.net/qq_26502245/article/details/108510131?utm_medium=distribute.wap_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.wap_blog_relevant_default&spm=1001.2101.3001.4242.2
posted on 2022-03-23 19:41  sunny123456  阅读(388)  评论(0编辑  收藏  举报