Java 如何从列表A中获取不带';不存在于列表B中

Java 如何从列表A中获取不带';不存在于列表B中,java,lambda,filter,java-8,java-stream,Java,Lambda,Filter,Java 8,Java Stream,我想从列表A中筛选出列表B中不存在的所有对象。如何使用Java流实现这一点 List<MyClass> A List<MyClass> B 列表A 名单B 我想按MyClass.id字段进行筛选 我的尝试: List<MyClass> actionsToRemoval = A.stream() .filter(oldAction -> B.stream() .noneMa

我想从列表A中筛选出列表B中不存在的所有对象。如何使用Java流实现这一点

List<MyClass> A
List<MyClass> B
列表A
名单B
我想按MyClass.id字段进行筛选

我的尝试:

List<MyClass> actionsToRemoval = A.stream()
                .filter(oldAction -> B.stream()
                        .noneMatch(action -> action.getId() != null && action.getId().equals(oldAction.getId()))).collect(
                        Collectors.toList());
List actionsToRemoval=A.stream()
.filter(oldAction->B.stream()
.noneMatch(action->action.getId()!=null&&action.getId().equals(oldAction.getId()).collect(
收藏家;
但结果与我的预期相反

更新:

我来自DEV的代码:

数据库中的数据:

private void removeUnnecessaryCorrectiveActions(List<IncidentCorrectiveActionDto> correctiveActionsDto) 
{
//correctiveActionsDto - data from Frontend, for exampe that object contains 3 objects with id=1 (this object should be updated), id=2 (new object), id=3 (ne w object)
List<IncidentCorrectiveAction> oldActions = incidentCorrectiveActionRepository
                .findByIncidentId(id)
//oldActions -> for example one object with id=1, fetched from database

    List<IncidentCorrectiveAction> actionsToRemoval = oldActions.stream()
                    .filter(oldAction -> correctiveActionsDto.stream()
                            .noneMatch(action -> action.getId() != null && action.getId().equals(oldAction.getId()))).collect(
                            Collectors.toList());
private void remove不必要的更正操作(列出更正操作SDTO)
{
//correctiveActionsDto-来自前端的数据,例如,对象包含3个id=1的对象(此对象应更新)、id=2(新对象)、id=3(新对象)
List oldActions=incidentCorrectiveActionRepository
.findByIncidentId(id)
//oldActions->例如,一个id=1的对象,从数据库中获取
List actionsToRemoval=oldActions.stream()
.filter(oldAction->correctiveActionsDto.stream()
.noneMatch(action->action.getId()!=null&&action.getId().equals(oldAction.getId()).collect(
收藏家;
所以在本例中,我的List actionsToRemoval应该返回0个元素,因为我们需要添加2个新元素并将它们保存在数据库中

另一种情况: oldActions->3个id=1、id=2、id=3的对象

correctiveActionsDto(来自前端的对象)->包含1个id为1的对象

在这种情况下,actionsToRemoval列表应该返回2个元素:id=2和id=3,因为这些对象应该从数据库中删除。

List FilteredOut=
List<MyClass> FilteredOutput =
              A.stream()
              .filter(e -> B.stream().map(MyClass::getid).anyMatch(id -> 
              id.equals(e.getid())))
              .collect(Collectors.toList());
A.溪流() .filter(e->B.stream().map(MyClass::getid).anyMatch(id-> id.equals(e.getid())) .collect(Collectors.toList());

将列表
A
作为流,然后将
A
的ID与
B
的ID进行比较。

最好的方法是将谓词逻辑封装在对象的equals方法中,然后使用
B.contains(x)
作为过滤器。 比如:

class-MyClass{
私有整数id;
...
公共布尔等于(对象其他){
返回MyClass的其他实例&&other.getId()!=null&&other.getId().equals(this.id);
} 
然后:

列表A=。。。;
清单B=。。。;
List diffAB=A.stream().filter(v->!B.contains(v)).collect(collector.asList());

我无法重现您的问题。您的代码对我有效。您能否共享一个包含两个列表内容的列表,以便我们重现您的问题?