Как удалить несколько элементов объекта из списка из другого в Java 8?

У меня есть класс Employee, который имеет 3 поля.

И у меня есть список объектов DTO.

public class Employee {
   private String empId;
   private String name;
   private String group;
   private String salary;       
}


List<Employee> listEmployeesA = new ArrayList<>(List.of(
 new Employee("101"."Mark", "A", 20000),
 new Employee("102"."Tom", "B", 3000),
 new Employee("103"."Travis", "C", 5000),
 new Employee("104"."Diana", null, 3500),
 new Employee("105"."Keith", "D", 4200),
 new Employee("106"."Liam", "E", 6500),
 new Employee("107"."Whitney", "F", 6100),
 new Employee("108"."Tina", null,2900)
 new Employee("109"."Patrick", "G", 3400)
 ));


List<Employee> listEmployeesB = new ArrayList<>(List.of(
 new Employee("101"."Mark", "A", 20000),
 new Employee("103"."Travis", "C", 5000),
 new Employee("104"."Diana", null, 3500),
 ));

У меня есть два списка для класса сотрудников, я удаляю все элементы объекта из спискаEmployeesA, который уже находится в спискеEmployeesB, только на основе только свойства empId, имени и группы, но не на основе зарплаты.

Я хочу сделать что-то похожее на приведенный ниже пример (на основе нескольких свойств класса):

listEmployeesA.removeAll(listEmployeesB);

Ожидаемый ниже список для listEmployeesA:

Employee("102"."Tom", "B", 3000),
Employee("105"."Keith", "D", 4200),
Employee("106"."Liam", "E", 6500),
Employee("107"."Whitney", "F", 6100),
Employee("108"."Tina", null,2900)
Employee("109"."Patrick", "G", 3400)
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
1
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте составные ключи, используя интересующие вас поля из listEmployeesB и удалите элемент из listEmployeesA, если составной ключ содержится в наборе:

Set<List<String>> set = listEmployeesB.stream()
                                .map(e -> Arrays.asList(e.empId, e.name, e.group))
                                .collect(Collectors.toSet());

listEmployeesA.removeIf(e -> set.contains( Arrays.asList(e.empId, e.name, e.group)));
Ответ принят как подходящий

Вы можете заставить removeAll работать с listEmployeesA.removeAll(listEmployeesB), добавив два метода в класс Employee:

  @Override
  public boolean equals (Object other)

  @Override
  public int hashCode () 

Когда вы это сделаете, в equals сравните только идентификатор, имя и группу. Кроме того, в hashCode создайте хэш-код из этих полей. Исключить зарплату как из equals, так и из hashCode.

Если вы не знаете, как закодировать хороший метод hashCode или equals, проверьте наличие в своей IDE инструмента, который может создавать код для этих методов.

Переопределение equals работает, потому что removeAll использует equals (Object) для сравнения элементов в каждом List. Без переопределения метода equals используется метод equals (Object o), унаследованный от Object, который проверяет, совпадают ли ссылки.

Когда вы переопределяете метод equals, всегда переопределяйте метод hashCode.

Другие вопросы по теме