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

3

我希望能够根据另一个列表中的条件值,从列表中删除项目。以下为对象:

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
}

假设Process对象如下所示

{
  "name": "process1",
  "listProcessDetail": [
    {
      "id": "456"
    },
    {
      "id": "666"
    },
    {
      "id": "555"
    }
  ]
}

Student是按如下方式填充的。

{
  "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"
        }
      ]
    }
  ]
}

来自listCoursesDetail的元素 ID 144 因为在对象Process中不存在而被移除了。
到目前为止,我的内容如下:
Set<String> ids = Process.getListProcessDetail().stream().map(ProcessDetail::id).collect(Collectors.toSet());

在这些中,我将所有的ID存储在一个集合(Set)中。
然后是我试图删除这些项目:
List<Course> courses = Student.getListCourses().stream().filter(c -> c.getListCoursesDetail().stream().anyMatch(d -> ids.contains(d.getId()))).collect(Collectors.toList());

通过这些代码,我得到了与没有发生任何事情时相同的学生对象。
1个回答

7

假设您想修改现有对象,而不是创建一个短列表的克隆,则可以按以下方式进行:

student.getListCourses().forEach(c ->
    c.getListCoursesDetail().removeIf(d -> ! ids.contains(d.getId())));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接