需求
业务场景:现在给出这么一个需求,两个系统,旧系统与新系统同一个月中的数据,比对两个list找出不重复的数据,然后在进行校验。emmm......其实说通俗点,就是求两个集合的差集。
最初想法:循坏集合,判断另一个集合是否包含,不包含则新添加到一个集合,方法比较笨拙,代码繁琐。。。
那么问题来了,如何处理两个集合的差集呢?此处分为两处处理模式:
- java8之前版本
- java8中的lambda表达式处理
java8之前的旧版本处理
此处主要运用到Collection集合提供的一个方法:
- removeAll(Collection list):removeAll方法用于从列表中移除指定collection中包含的所有元素。
- removeAll(Collection<?> c) c:包含从列表中移除元素的collection对象。 该方法返回值为boolean对象,如果List集合对象由于调用removeAll方法而发生更改,则返回
true,否则返回false
话不多说,上代码:
ArrayList<Integer> list1 = new ArrayList<> ();
ArrayList<Integer> list2 = new ArrayList<> ();
//list1添加元素
list1.add (1);
list1.add (3);
list1.add (2);
//list2添加元素
list2.add (3);
list2.add (4);
list2.add (5);
//差集
ArrayList<Integer> list3 = new ArrayList<>(list1);
list1.removeAll(list2); //输出结果 [1,2]
list2.removeAll(list3);//输出结果 [4,5]
list1.addAll(list2);
System.out.println("差集:"+list1); //输出结果
java8之后的版本处理
此处引用的是Java8的lambda表达式处理: 代码如下:
ArrayList<Integer> list1 = new ArrayList<> ();
ArrayList<Integer> list2 = new ArrayList<> ();
//list1添加元素
list1.add (1);
list1.add (3);
list1.add (2);
//list2添加元素
list2.add (3);
list2.add (4);
list2.add (5);
//差集list1 - list2
List<Integer> difference = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
//差集list2 - list1
List<Integer> difference = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
逻辑其实是一样的,但lamdba给人一种简洁高级的感觉,性能方面也要好很多。
题外
既然说到了差集,那索性就把并集,交集一起说了吧~~~~
公用代码
ArrayList<Integer> list1 = new ArrayList<> ();
ArrayList<Integer> list2 = new ArrayList<> ();
//list1添加元素
list1.add (1);
list1.add (3);
list1.add (2);
//list2添加元素
list2.add (3);
list2.add (4);
list2.add (5);
Java8之前的旧版本
其中,并集用到的方法是addAll(); 交集用到的是retainAll();
注意:retainAll()方法,切记踩坑:
例如A.retainAll(B);
- retainAll命令,返回的是一个boolean值;
- 如果AB中有相同的元素,那么A中会保留相同的元素,将不同的元素移除;
- 如果AB中没有相同的元素,那么会返回[]
- 当A中的元素有变化时会返回true,没有变化会返回false
retainAll命令返回的是两个list同时包含的内容
首先调用retainAll的方法
通过判断结果集合是否大于0,来确定是否存在交集。不能通过方法返回的True和False来判断。
当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False
//有重复并集
list1.addAll(list2);
//无重复并集
list2.removeAll(list1);
list1.addAll(list2);
//交集
list1.retainAll(list2);
system.out.println(list1);
Java8之后的版本
//并集
List<String> listAll = list1.parallelStream().collect(toList());
List<String> listAll2 = list2.parallelStream().collect(toList());
listAll.addAll(listAll2);
//去重并集
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
//交集
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());