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

Spa*_*key 2 java intersection list java-8 java-stream

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

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());
Run Code Online (Sandbox Code Playgroud)

有类似的方法可以根据的id场找到交点MyObject吗?我无法覆盖equals方法。

Nic*_*cko 7

与上述Eran的答案类似,但也许可以稍微提高效率,您可以先将ID拉出到单独的Set中:

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());
Run Code Online (Sandbox Code Playgroud)

之所以会更高效,是因为list1您可以为其中的每个项目确定ID是否list2在O(1)时间内,因此总体而言,您的运行时为O(list1 + list2)