java8 实现两个集合之间进行元素比较

首先我们有两个集合A,B,我们以其中一个集合A为基准

想获得B集合中的元素,相对于A集合来说,哪些元素不存在,哪些元素A没有

业务场景:以db1中的数据为准,更新db2中的数据,db1有的,db2没有的进行添加操作,db2有的,db1没有的进行删除操作

那么我们就需要知道,哪些元素是要添加的,哪些是要删除的

 

传统做法:通过标记实现

  private static Map> getContrast(List newTypeList, List oldTypeList){

    Map map = new HashMap<>();
    Map> resultMap = new HashMap<>();

    //被删除的集合
    List deleteList = new ArrayList<>();
    //添加的集合
    List addList = new ArrayList<>();

    //遍历标记新的集合元素为1
    for (String nItem : newTypeList) {
      map.put(nItem,1);
    }

    //遍历标记相同的集合元素为2
    for (String oItem : oldTypeList) {
      Integer tag = map.get(oItem);
      if (tag != null) {
        map.put(oItem,2);
        continue;
      }
      //标记 旧集合元素为3
      map.put(oItem,3);
    }

    for (Map.Entry entry : map.entrySet()) {
      if (entry.getValue().equals(1)) {
        addList.add(entry.getKey());
        resultMap.put("addList",addList);
      }
      if (entry.getValue().equals(3)) {
        deleteList.add(entry.getKey());
        resultMap.put("delList",deleteList);
      }
    }
    return resultMap;
  }

测试:

public static void main(String[] args) {
    List newList = new ArrayList<>();
    newList.add("apple");
    newList.add("banana");
    newList.add("pina");

    List oldList = new ArrayList<>();
    oldList.add("apple");
    oldList.add("mikl");

    Map> contrast = getContrast(newList, oldList);
    for (Map.Entry> stringListEntry : contrast.entrySet()) {
      System.out.println(stringListEntry.getKey() + "-" + stringListEntry.getValue());
    }

  }

测试结果:我们可以看到相对新的集合来说,老的集合没有“banana”和“pina”,而老的集合有的“milk”新的集合则没有,结果正确

java8 实现两个集合之间进行元素比较_第1张图片

 

JAVA8做法:通过流实现

public static void main(String[]args){
    List list1 = new ArrayList();
    list1.add("apple");
    list1.add("banana");
    list1.add("pina");

    List list2 = new ArrayList();
    list2.add("apple");
    list2.add("mikl");

    //交集
    List collect1 = list1.stream().filter(num -> list2.contains(num))
            .collect(Collectors.toList());
    System.out.println("交集: " + collect1);
//    collect1.stream().forEach(System.out::println);

    //差集 list1-list2
    List collect2 = list1.stream().filter(num -> !list2.contains(num))
            .collect(Collectors.toList());
    System.out.println("addList 即差集list1-list2: " + collect2);
//    collect2.stream().forEach(System.out::println);

    //差集list2-list1
    List collect3 = list2.stream().filter(num -> !list1.contains(num))
            .collect(Collectors.toList());
    System.out.println("delList 即差集list2-list1: " + collect3);
//    collect3.stream().forEach(System.out::println);

    //并集  不去重
    list1.addAll(list2);
    System.out.println("并集 不去重: " + list1);
//    list1.stream().forEach(System.out::println);

    //并集  去重
    List collect4 = list1.stream().distinct().collect(Collectors.toList());
    System.out.println("并集 去重: " + collect4);
//    collect4.stream().forEach(System.out::println);
  }

结果:

java8 实现两个集合之间进行元素比较_第2张图片

效果是一样的,但是代码量少了很多

你可能感兴趣的:(技术分享,java)