java8将两个对象集合根据两个不同的共有字段取差集
要根据两个不同的共有字段取差集,可以使用Java 8的stream和lambda表达式来实现。假设有两个对象集合A和B,且对象的共有字段有field1和field2。
首先,需要定义一个用于比较的函数,该函数接受两个对象作为参数,返回一个布尔值表示两个对象是否相等。可以根据field1和field2进行比较,只有当两个字段的值都相等时,对象才被认为是相等的。
然后,可以使用stream的filter操作来过滤集合A中不包含在集合B中的对象。可以使用lambda表达式来定义过滤的条件,即当集合B中不存在与当前对象相等的对象时,保留该对象。
最后,可以将结果收集到一个新的集合中,使用stream的collect操作,并指定一个收集器来将过滤后的对象收集到一个新的集合中。
下面是一个示例代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 创建集合A和B
List<MyObject> listA = new ArrayList<>();
listA.add(new MyObject("A", 1));
listA.add(new MyObject("B", 2));
listA.add(new MyObject("C", 3));
List<MyObject> listB = new ArrayList<>();
listB.add(new MyObject("A", 1));
listB.add(new MyObject("B", 3));
listB.add(new MyObject("D", 4));
// 根据共有字段取差集
List<MyObject> difference = listA.stream()
.filter(a -> listB.stream()
.noneMatch(b -> a.getField1().equals(b.getField1()) && a.getField2() == b.getField2()))
.collect(Collectors.toList());
// 输出差集
difference.forEach(System.out::println);
}
}
class MyObject {
private String field1;
private int field2;
public MyObject(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
public String getField1() {
return field1;
}
public int getField2() {
return field2;
}
@Override
public String toString() {
return "MyObject{" +
"field1='" + field1 + '\'' +
", field2=" + field2 +
'}';
}
}
运行上述代码,将会输出差集的对象。在上述示例中,差集为[C, 3]
原文地址: https://www.cveoy.top/t/topic/hMv0 著作权归作者所有。请勿转载和采集!