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

问题描述 投票:1回答:2

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

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对象,什么也没发生。

java list filter java-8 java-stream
2个回答
3
投票

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

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

0
投票

应该过滤的是listCoursesDetail字段,而不是listCourses

Student.getListCourses()
    .forEach(c -> c.setListCoursesDetail(c.getListCoursesDetail().stream()
        .filter(lcd -> ids.contains(lcd.getId())
        .collect(Collectors.toList()));
© www.soinside.com 2019 - 2024. All rights reserved.