Удалить элемент из вложенного списка с условием из другого списка - Java 8 - PullRequest
3 голосов
/ 25 марта 2020

Я хочу удалить элементы из списка с условным значением из другого списка. Вот объекты

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, где идентификатор не равен идентификатору этого другого объекта.

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

Студент заполняется следующим образом.

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

В них я сохранил все идентификаторы в наборе.

Затем моя попытка удалить элементы:

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

С этими строками кода я получаю тот же объект Student, что и ничего не произошло.

1 Ответ

5 голосов
/ 25 марта 2020

Если вы хотите изменить существующие объекты, а не создавать их клон с более короткими списками, вы сделаете это следующим образом:

student.getListCourses().forEach(c ->
    c.getListCoursesDetail().removeIf(d -> ! ids.contains(d.getId())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...