我有一个类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),
));
我有两个雇员类列表,我仅基于属性empId、名称和组,而不是基于薪金,从listEmployeesA(已在listEmployeesB中)中删除所有对象元素。
我想做一些看起来像下面的例子(基于几个类属性):
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)
2条答案
按热度按时间czq61nw11#
使用
listEmployeesB
中感兴趣的字段创建复合键,如果集合中包含复合键,则从listEmployeesA
中删除元素:qvsjd97n2#
通过向
Employee
类添加两个方法,可以使removeAll
与listEmployeesA.removeAll(listEmployeesB)
一起工作:在
equals
中,只比较ID、name和group。另外,在hashCode
中,从这些字段构建一个散列代码。从equals
和hashCode
中排除salary。如果您不知道如何编写好的
hashCode
或equals
方法,请检查IDE中是否有可以为这些方法创建代码的工具。覆盖
equals
之所以有效,是因为removeAll
使用equals (Object)
来比较每个List
中的元素。在不覆盖equals方法的情况下,使用从Object
继承的equals (Object o)
方法,该方法测试引用是否相同。覆盖
equals
方法时,* 始终 * 覆盖hashCode
方法。