Кто-нибудь может сказать мне, что я делаю не так?
Вы нарушаете Побочные эффекты принцип java-stream , который в двух словах говорит, что поток не должен изменять другую коллекцию при выполнении действий через конвейеры.Я не проверял ваш код, однако вам не следует обрабатывать потоки.
Как это сделать лучше?
Просто используйтеList::contains
в предикате фильтра, чтобы избавиться от уникальных значений.
List<Student> students = originalStudent.stream()
.filter(newStudent::contains)
.collect(Collectors.toList());
Это решение (понять метод List::contains
) основано нареализовано сравнение на равенство с использованием Object::equals
.Следовательно, необходимо переопределить тот же метод в классе Student
.
Редактировать: Пожалуйста, имейте в виду, что автоматическое переопределение Object::equals
помнит id
для вычисления равенства.Поэтому равенство будет основываться только на имени и фамилии.(спасибо @ nullpointer ).
Без переопределения Object::equals
?
Вы должны выполнить сравнение в filter
, используядругой stream
и метод Stream::anyMatch
, который возвращает true
, если предикат квалифицирован.
List<Student> students = originalStudent.stream()
.filter(os -> newStudent.stream() // filter
.anyMatch(ns -> // compare both
os.getName().equals(ns.getName() && // name
os.getLastName().equals(ns.getLastName()))) // last name
.collect(Collectors.toList());