java8两个集合取交集、并集与差集

摘要:
Java8API添加了一个名为StreamStream的新抽象,它允许您以声明方式处理数据。流使用一种类似于使用SQL语句从数据库查询数据的直观方式,提供Java集合操作和表达式的高级抽象。例如,有以下类:1ClassPerson{2privateid;3PrivateStringname;4publicPerson(){}5publicPerson{6this.id=id;7this.name=name;8}9}然后有以下两个集合:1List<Person>listA=newArrayList<>();2List<Person>listB=newArrayList<>();3列表A。添加4列表A。添加5列表A。添加6列表A。添加78列表B。添加9列表B。添加10列表B。添加现在我希望在集合listA和listB之间发生一些事情,例如标题中提到的交集集合、并集和差集。

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

(以上高大上的名词解释内容来自网络,楼主一脸懵B...总之一句话,集合间的去重操作,在java8的流式操作中,变得很优雅,/花鸡)

比如有以下类:

1 Class Person{
2     private int id;
3     private String name;
4 public Person(){} 5 public Person(int id, String name){ 6 this.id=id; 7 this.name = name; 8 } 9 }

然后有以下俩集合:

 1 List<Person> listA = new ArrayList<>();
 2 List<Person> listB = new ArrayList<>();
3 listA.add(new Person(1,"aa")); 4 listA.add(new Person(1,"bb")); 5 listA.add(new Person(1,"cc")); 6 listA.add(new Person(1,"dd")); 7 8 listB.add(new Person(1,"aa")); 9 listB.add(new Person(1,"bb")); 10 listB.add(new Person(1,"cc"));

现在希望集合listA与listB之间发生点事,擦出点火花,比如标题上说的求交集(listA ∩ ListB)、求并集(listA ∪ listB)、求差集(listA - listB)。

由于两集合里保存的是对象信息,它们在进行如上操作时,要有比较判断依据,比如,id值和姓名值相同的情况下,认为俩个集合保存的是相同的对象数据。

此时,我们需要先重写Person类的equals方法,如下:

Class Person{
     private int id;
     private String name;
public Person(){} public Person(int id, String name){ this.id=id; this.name = name; } @override public boolean equals(Object obj){ if(this == obj){ return true; } if(obj == null){ return false; } if(getClass() != obj.getClass()){ return false; } Person other = (Person) obj; if(id != other.id){ return false; } if(name == null){ if(other.name != null){ return false; } }else if(!name.equals(other.name)){ return false; } return true; } }

最后,优雅地写出集合listA与listB之间发生的那些事吧。

交集(listA ∩ ListB):

List<Person> listC = listA.stream().filter(item -> listB.contains(item)).collect(Collectors.toList());

listC中的元素有:属性name值为 aa, bb, cc 的对象。

并集(listA ∪ listB):

//先合体
listA.addAll(listB);
//再去重
List<Person> listC = listA.stream().distinct().collect(Collectors.toList());

listC中的元素有:属性name值为 aa, bb, cc ,dd的对象。

差集(listA - listB):

List<Person> listC = listA.stream().filter(item -> !listB.contains(item)).collect(Collectors.toList());

listC中的元素有:属性name值为 dd的对象。

火花擦完了, that's all.......

免责声明:文章转载自《java8两个集合取交集、并集与差集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C3P0线程死锁问题探讨java 压缩成zip文件、解压zip文件(可设置密码)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转) 淘淘商城系列——Redis五种数据类型介绍

http://blog.csdn.net/yerenyuan_pku/article/details/72855562 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。下面我分别介绍之。 String(字符串) 字符串是Redis中最基本的数据类型,它能够存...

VBScript学习笔记

(一)运算符 1. +运算符可连接字符串         fullname = firstname + " " + lastname     但推荐使用&运算符,&专用于字符串连接         fullname = firstname & " " & lastname 2. 算术运算符:         ^       ...

Scala基础之集合(数组)

集合介绍 Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本。 集合可变,不可变的区别 Scala默认提供的集合都是不可变。 不可变:增删改 都会返回有个新数组 可变:可增删改  可变: scala.collection.mutable ha...

《深度剖析CPython解释器》29. Python内存管理与垃圾回收(第二部分):源码解密Python中的垃圾回收机制

楔子 现在绝大部分的语言都实现了垃圾回收机制,这其中也包括Python,而不同的语言采用的垃圾回收算法也各不相同。那么,常见的垃圾回收算法都有哪些呢? 引用计数法(reference count): 记录对象的被引用此处, 引用计数降为0时回收 标记-清除法(mark-sweep): 从根集合触发, 遍历所有能访问到的对象并对其进行标记, 然后将未被标记...

容器知识的重点总结

什么是容器 数组也是一种容器,可以存放对象或基本数据类型,数组的劣势在于不灵活,容器需要事先定义好,不能随着需求而改变而扩容。而容器则可以随时扩容来装对象,容器也称为集合。 容器的结构 单例集合 将数据一个一个的进行存储 双例集合 基于 key 和 value 的结构存储数据 Collection 接口 LIst接口:有序,可重复 ArrayList 容...

(java实现)杭电oj 2034 人见人爱A-B

人见人爱A-B Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 68543Accepted Submission(s): 19203 Problem Description 参加过上个月月赛的同学一定还记得...