问题分析
现在有两个类:
class ClassA {
String id;
String realName;
public ClassA(String id, String realName) {
this.id = id;
this.realName = realName;
}
@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() {
return 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.equals(a.getId(), id) //判断id的值是否相等
)
)
.collect(Collectors.toList()); //将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.equals(b.getId(), id))).collect(Collectors.toList());
System.out.println(differenceB);
输出结果为:
[ClassB{id=‘4’, nickName=‘赵某’}]