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

从另一个列表中删除嵌套列表中具有条件的元素-Java 8,java,list,filter,java-8,java-stream,Java,List,Filter,Java 8,Java Stream,我想从一个列表中删除具有来自另一个列表的条件值的项目。这些是物品 公立班学生{ 私有字符串名称; 私弦时代; 私人名单课程; //二传手和接球手 } 公共课{ 私有字符串courseName; 私人列表课程详情; //二传手和接球手 } 公共课程详情{ 私有字符串id; 私家弦级; 私人弦乐教授; //二传手和接球手 } 如你所见,对象学生有一个列表,在该列表中有另一个来自对象CourseDetail的列表。我想要实现的是从私有列表listCoursesDetail中过滤或删除元素,其中ID不等

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

公立班学生{ 私有字符串名称; 私弦时代; 私人名单课程; //二传手和接球手 } 公共课{ 私有字符串courseName; 私人列表课程详情; //二传手和接球手 } 公共课程详情{ 私有字符串id; 私家弦级; 私人弦乐教授; //二传手和接球手 } 如你所见,对象学生有一个列表,在该列表中有另一个来自对象CourseDetail的列表。我想要实现的是从私有列表listCoursesDetail中过滤或删除元素,其中ID不等于另一个对象的ID

公共类过程{ 私有字符串名称; 私有列表列表详细信息; //二传手和接球手 } 公共类ProcessDetail{ 私有字符串id; //二传手和接球手 } 假设对象进程按如下方式填充

{
  "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的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())));