标题是什么意思呢?
假如我有一个集合对象A,数据有1,2,3,4,5,6
另外一个集合对象B,数据有2,4,5
那么在A中排除B拥有的数据就是
最终需要返回的结果就是1,3
那么我们一般一开始的想法其实就是在集合对象中A遍历取到每一个元素,然后将元素再与集合对象B中遍历取到的每一个元素,做一 一对比,,如果在集合对象B中没有找到的话,那么就取出该此时集合对象中遍历的当前元素,然后放到一个最终的集合去。
所以我们就是会写两个for循环,外层循环遍历集合对象A,内层循环遍历集合对象B,反之,
外层循环遍历集合对象B,内层循环遍历集合对象A,也是可以的。结果都是一样的。
假如现在我们构建一个实体类叫做Entity,我们看看它的结构:
然后我们构造两个集合。去存放不同的Entity,充当集合对象A,集合对象B
集合对象A存放的是从1-10;
集合对象B存放的是偶数,也就是2,4,6,8,10;
那么最终排除后的结果就是奇数,也就是1,3,5,7,9
然后现在编写代码,按照我们一开始最粗暴的想法,就是两个for循环嵌套的做法:
我们看一下输出结果:
结果显示确实是奇数,那就证明我们代码写的没问题。
那么我们可以换一种更加方便通用的思路,就是用stream流的方式先做逻辑映射,然后再使用filter过滤掉contains为false的数据,如下:
直接就可以用三行代码代替了,是不是很方便。
所以模板思路就是以后我们要在哪一个集合对象里面排除另一个集合对象,那么我们就将要排除的做map映射,然后对另一个集合对象做filter过滤掉contains为false的,就是最终的结果,以这个题目就是A排除B,那么就将B做map映射,将A做filter过滤掉contains为false的。
如果我们要判断两个集合对象是否存在重复的。我们也可以用这个方法,但是此时就对A和B没做特定哪一个做map,哪一个做filter了,都行的。只是我们需要将里面的那个contains过滤掉为true的,然后最终结果如果返回的集合存在数据,就代表有交集了,有交集,肯定就是出现重复的了。
也就是:
输出结果:重复的就是偶数2 4 6 8 10
总结:
在一个集合对象中A排除另外一个集合对象B中A中拥有的数据通用思路可以直接用三行代码替换
,对要排除的做map逻辑映射,另外一个对象做stream流的filter过滤掉contains为false的。
Set<String> codeSet = 排除的集合对象.stream().map().collect(Collectors.toSet()) ;
List<T> res = 另一个集合对象.stream().filter(arg -> !codeSet.contains(arg)).collect(Collectors.toList());
return res ;
备注:如果要判断两个集合对象是否存在重复的元素,也是这个思路,只不过是过滤掉contains为true的,此时不需要按照上面那这个模板思路谁map谁filter了。
温馨提示:
我们也可以导入hutool工具包,然后里面其实有很多的求差集,补集,交集,并集。
最后:
如果大家觉得这篇文章对你们有所帮助的话,麻烦点个免费的小赞赞,谢谢,也祝各位码农在未来的IT道路上越走越远!