如果我有两个对象列表,我可以按如下方式找到交集:
public class MyObject {
String id;
String someField;
String someOtherField;
}
List<MyObject> list1;
List<MyObject> list2;
List<MyObject> intersect = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
是否有类似的方法根据MyObject
的id
字段查找交集?我无法重写 equals 方法。
最佳答案
与上面 Eran 的答案类似,但也许效率稍高一些,您可以先将 ID 拉出到一个单独的集合中:
Set<String> ids = list2.stream().map(obj -> obj.id).collect(Collectors.toSet());
List<MyObject> intersect = list1.stream()
.filter(obj -> ids.contains(obj.id))
.collect(Collectors.toList());
这样做会更高效的原因是,对于 list1
中的每个项目,您可以在 O(1) 时间内确定 ID 是否在 list2
中,因此总体来说您的运行时间是 O(list1 + list2)
关于java - 按对象属性计算两个列表的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57304802/