两个列表按对象属性的交集

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


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

id是否有类似的方法可以根据的领域找到交集MyObject?我无法覆盖 equals 方法。


慕工程0101907
浏览 163回答 4
4回答

杨魅力

与上面 Eran 的回答类似,但效率可能稍高一些,您可以先将 ID 拉出到一个单独的 Set 中:Set<String>&nbsp;ids&nbsp;=&nbsp;list2.stream().map(obj&nbsp;->&nbsp;obj.id).collect(Collectors.toSet()); List<MyObject>&nbsp;intersect&nbsp;=&nbsp;list1.stream() &nbsp;&nbsp;&nbsp;&nbsp;.filter(obj&nbsp;->&nbsp;ids.contains(obj.id)) &nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());这会更有效的原因是,对于每个项目,list1您可以确定 ID 是否在list2O(1) 时间内,因此总体而言,您的运行时间为 O(list1 + list2)

函数式编程

您可以尝试这种方法。但我认为这对性能没有好处:List<MyObject>&nbsp;intersect&nbsp;=&nbsp;list1.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(l1&nbsp;->&nbsp;list2.stream().anyMatch(l2&nbsp;->&nbsp;l2.id.equals(l1.id))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

POPMUISE

是的:List<MyObject>&nbsp;intersect&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;list1.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(obj1&nbsp;->&nbsp;list2.stream().map(MyObject::getId).anyMatch(id&nbsp;->&nbsp;id.equals(obj1.getId())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());当然,如果两个MyObject具有相同id的实例被认为是相同的,你可以实现一个当且仅当id相同时equals返回的方法true,然后你的原始代码就足够了。

哔哔one

将 提取ids到 a&nbsp;Set,以便尽可能快地进行查找:Set<String>&nbsp;inclusionsSet&nbsp;=&nbsp;list2.stream().map(a&nbsp;->&nbsp;a.id()).collect(Collectors.toSet()); List<String>&nbsp;intersection&nbsp;=&nbsp;list1.stream().filter(a&nbsp;->&nbsp;inclusionsSet.contains(a)).collect(Collectors.toList());
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java