使用条件从另一个列表中删除嵌套列表中的元素 - Java 8

Kev*_*dez 3 java list filter java-8 java-stream

我想从具有来自另一个列表的条件值的列表中删除项目。这是对象

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

正如您所看到的,该对象Student有一个列表,该列表内还有来自对象 CourseDetail 的另一个列表。我想要实现的是过滤或删除 private 中的元素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
}
Run Code Online (Sandbox Code Playgroud)

假设对象 Process 的填充如下

{
  "name": "process1",
  "listProcessDetail": [
    {
      "id": "456"
    },
    {
      "id": "666"
    },
    {
      "id": "555"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

学生人数如下。

{
  "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"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

预期结果将是:

{
  "name": "Kevin",
  "age": "22",
  "listCourses": [
    {
      "courseName": "456",
      "listCoursesDetail": [
        {
          "id": "666",
          "grade": "88",
          "professor": "Xavier"
        },
        {
          "id": "555",
          "grade": "100",
          "professor": "Joe"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

listCoursesDetail 中的元素ID 144已被删除,因为对象中没有这样的值Process

到目前为止我有这些:

Set<String> ids = Process.getListProcessDetail().stream().map(ProcessDetail::id).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

在这些中,我将所有 ID 存储在一个集合中。

然后我尝试删除这些项目:

List<Course> courses = Student.getListCourses().stream().filter(c -> c.getListCoursesDetail().stream().anyMatch(d -> ids.contains(d.getId()))).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

通过这些代码行,我得到了相同的 Student 对象,就像什么都没发生一样。

And*_*eas 7

假设您想要修改现有对象,而不是使用较短的列表创建它们的克隆,您可以这样做:

student.getListCourses().forEach(c ->
    c.getListCoursesDetail().removeIf(d -> ! ids.contains(d.getId())));
Run Code Online (Sandbox Code Playgroud)