在Java 8中,如何从一个列表中移除多个对象元素?

2w3rbyxf  于 2023-02-14  发布在  Java
关注(0)|答案(2)|浏览(248)

我有一个类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)
czq61nw1

czq61nw11#

使用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)));
qvsjd97n

qvsjd97n2#

通过向Employee类添加两个方法,可以使removeAlllistEmployeesA.removeAll(listEmployeesB)一起工作:

@Override
  public boolean equals (Object other)

  @Override
  public int hashCode ()

equals中,只比较ID、name和group。另外,在hashCode中,从这些字段构建一个散列代码。从equalshashCode中排除salary。
如果您不知道如何编写好的hashCodeequals方法,请检查IDE中是否有可以为这些方法创建代码的工具。
覆盖equals之所以有效,是因为removeAll使用equals (Object)来比较每个List中的元素。在不覆盖equals方法的情况下,使用从Object继承的equals (Object o)方法,该方法测试引用是否相同。
覆盖equals方法时,* 始终 * 覆盖hashCode方法。

相关问题