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