У меня есть класс 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)
Создайте составные ключи, используя интересующие вас поля из 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.