我想从列表中删除具有来自另一个列表的条件值的项目。这是对象
public class Student{
private String name;
private String age;
private List<Course> listCourses;
//Setters and getters
}
public Class Course{
private String courseName;
private List<CourseDetail> listCoursesDetail;
//Setters and getters
}
public Class CourseDetail{
private String id;
private String grade;
private String professor;
//Setters and getters
}
因此您可以看到对象Student
有一个列表,该列表内有来自对象CourseDetail的另一个列表。我要实现的是从私有List<CourseDetail> listCoursesDetail
中过滤或删除元素,其中ID不等于该另一个对象的ID。
public class Process{
private String name;
private List<ProcessDetail> listProcessDetail;
//Setters and getters
}
public class ProcessDetail{
private String id;
//Setters and getters
}
假定对象过程如下填充
{
"name": "process1",
"listProcessDetail": [
{
"id": "456"
},
{
"id": "666"
},
{
"id": "555"
}
]
}
学生如下填充。
{
"name": "Kevin",
"age": "22",
"listCourses": [
{
"courseName": "Math",
"listCoursesDetail": [
{
"id": "666",
"grade": "88",
"professor": "Xavier"
},
{
"id": "144",
"grade": "90",
"professor": "Marcus"
},
{
"id": "555",
"grade": "100",
"professor": "Joe"
}
]
}
]
}
预期结果将是:
{
"name": "Kevin",
"age": "22",
"listCourses": [
{
"courseName": "456",
"listCoursesDetail": [
{
"id": "666",
"grade": "88",
"professor": "Xavier"
},
{
"id": "555",
"grade": "100",
"professor": "Joe"
}
]
}
]
}
由于对象ID 144
中没有这样的值,因此删除了带有Process
的listCoursesDetail中的元素。
到目前为止,我有这些:
Set<String> ids = Process.getListProcessDetail().stream().map(ProcessDetail::id).collect(Collectors.toSet());
其中,我将所有ID都存储在集合中。
然后尝试删除项目:
List<Course> courses = Student.getListCourses().stream().filter(c -> c.getListCoursesDetail().stream().anyMatch(d -> ids.contains(d.getId()))).collect(Collectors.toList());
使用这些代码行,我得到了相同的Student对象,什么也没发生。
假设您要修改现有对象,而不是使用较短的列表创建它们的副本,您可以这样做:
student.getListCourses().forEach(c ->
c.getListCoursesDetail().removeIf(d -> ! ids.contains(d.getId())));
应该过滤的是listCoursesDetail
字段,而不是listCourses
:
Student.getListCourses()
.forEach(c -> c.setListCoursesDetail(c.getListCoursesDetail().stream()
.filter(lcd -> ids.contains(lcd.getId())
.collect(Collectors.toList()));