У меня есть два списка, содержащие объекты этого класса:
public class ClassObj {
private Integer Id;
private List<String> students;
}
Я хочу сравнить объекты в этих двух списках по студентам. Я должен сравнить списки и получить данные ниже
- Мне нужно создать новый список, содержащий те
ClassObj
объекты, которые присутствуют в list1
, но не в list2
- Мне нужно создать новый список, содержащий те
ClassObj
объекты, которые присутствуют в list2
, но отсутствуют в list1
- Мне нужно создать новый список, содержащий те
ClassObj
объекты, которые присутствуют в обоих списках используя потоки java8
Я пытался с помощью приведенного ниже кода
List<ClassObj> prevYearList = getPrevYearData(id);
List<ClassObj> currYearList = getCurrentYearData(id);
Найти студентов, которые получили T C (существует в списке 1, но отсутствует в списке 2)
List<ClassObj> studentsGotTC = prevYearList.stream()
.filter(curr -> (currYearList.stream().filter(prev -> prev.getStudents().equals(curr.getStudents()))
.count()) < 1)
.collect(Collectors.toList());
Чтобы найти новое поступление (существует в списке 2, но отсутствует в списке 1)
List<ClassObj> newAdmission = currYearList.stream()
.filter(prev -> (prevYearList.stream()
.filter(curr -> prev.getStudents().equals(curr.getStudents())).count()) < 1)
.collect(Collectors.toList());
Чтобы найти учеников, продолжающих обучение в школе (существует в обоих списках)
List<List<String>> studentsList = studentsGotTC.parallelStream()
.map(ClassObj::getStudents)
.collect(Collectors.toList());
List<ClassObj> existingStudents = prevYearList.stream()
.filter(e -> !studentsList.contains(e.getStudents()))
.collect(Collectors.toList());
Он возвращает мне результаты правильно, но я не хочу go через два потока и фильтровать данные, как эффективно оптимизировать приведенный выше код. то есть, используя один поток