Java使⽤Stream求对象集合的交集、差集详解问题分析
现在有两个类:
class ClassA {
String id;
String realName;
public ClassA(String id, String realName){
this.id = id;
}
@Override
public String toString(){
return"ClassA{"+
"id='"+ id +'\''+
", realName='"+ realName +'\''+
'}';
}
public String getId(){
return id;
}
public String getRealName(){
return realName;
}
}
class ClassB {
String id;
String nickName;
public ClassB(String id, String nickName){
this.id = id;
this.nickName = nickName;
}
@Override
public String toString(){
return"ClassB{"+
"id='"+ id +'\''+
", nickName='"+ nickName +'\''+
'}';
}
public String getId(){
java streamreturn id;
}
public String getNickName(){
return nickName;
}
}
现在有两个集合,分别是ClassA对象的集合、ClassB对象的集合:
List<ClassA> aList =new ArrayList<>(Arrays.asList(
new ClassA("1","张三"),
new ClassA("2","李四"),
new ClassA("3","王五")
));
List<ClassB> bList =new ArrayList<>(Arrays.asList(
new ClassB("2","李某"),
new ClassB("3","王某"),
new ClassB("4","赵某")
));
现在要根据id求任意两个集合的交集、差集。
基本思想
基本思想就是想遍历第⼀个集合,取出第⼀个集合中的每个元素的某个属性,并使⽤这个属性遍历第⼆个集合,看这个属性是否在第⼆个集合中存在。相当于是有两层循环。
Java 8中引⼊了Stream和Lambda表达式,使⽤它们⽆需⾃⼰编写for循环,只需⼀⾏代码就能实现上述功能。
代码实现
求交集
//aList与bList的交集
List<ClassA> intersectA = aList
.stream()//获取第⼀个集合的Stream1
.filter(//取出Stream1中符合条件的元素组成新的Stream2,lambda表达式1返回值为true时为符合条件
a ->//lambda表达式1,a为lambda表达式1的参数,是Stream1中的每个元素
bList.stream()//获取第⼆个集合的Stream3
.map(ClassB::getId)//将第⼆个集合每个元素的id属性取出来,映射成新的⼀个Stream4
.anyMatch(//返回值(boolean):Stream4中是否⾄少有⼀个元素使lambda表达式2返回值为true
id ->//lambda表达式2,id为lambda表达式2的参数,是Stream4中的每个元素
Objects.Id(), id)//判断id的值是否相等
)
)
.List());//将Stream2转换为List
System.out.println(intersectA);
输出结果为:
[ClassA{id=‘2’, realName=‘李四’}, ClassA{id=‘3’, realName=‘王五’}]
求差集
//bList与aList的差集
List<ClassB> differenceB = bList.stream().filter(b -> aList.stream().map(ClassA::getId).noneMatch(id -> Objects.Id(), id))).Li st());
System.out.println(differenceB);
输出结果为:
[ClassB{id=‘4’, nickName=‘赵某’}]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论