Java 如何从列表A中获取不带';不存在于列表B中
我想从列表A中筛选出列表B中不存在的所有对象。如何使用Java流实现这一点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
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());
我无法重现您的问题。您的代码对我有效。您能否共享一个包含两个列表内容的列表,以便我们重现您的问题?