java - 按对象属性计算两个列表的交集

标签 java list java-8 java-stream intersection

如果我有两个对象列表,我可以按如下方式找到交集:

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());

是否有类似的方法根据MyObjectid字段查找交集?我无法重写 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/

相关文章:

java - 在列表中搜索单词,然后获取列表中两点之间的所有字符串

c# - 如何在列表中查找重复项并按出现次数对它们进行排序

java - 具有连接和排序依据的查询生成器?

java - 如何从 Java 中扩展抽象类的 Class 对象运行抽象方法?

java - Selenium-Java-Actions 类型错误 : rect is undefined

java - 在 Parse 上检索文件 - 图像

java - 如何使用流将此程序转换为 Java 8 函数式风格?

java - Java如何将TimeStamp直接转换成Seconds

python - 从 dict 列表中删除具有相同 id 的 dict

java - 在 Java 8 中使用流反转 map