Java List调用removeAll方法删除另一列表元素不生效问题
问题根因
ArrayList的removeAll方法判断元素是否匹配的核心逻辑依赖equals()方法,只有原列表元素和待删除列表元素的equals()返回true时,才会被判定为需要删除的目标元素。- 你自定义的
Employee类没有重写equals()方法,默认使用Object类的原生实现,该实现仅对比两个对象的内存地址是否一致。你代码里两个Employee实例是独立new出来的对象,虽然所有业务属性值完全相同,但内存地址不同,因此会被判定为不相等,无法触发删除。 - 额外注意:Java规范要求重写
equals()方法时必须同步重写hashCode()方法,避免对象存入哈希结构集合(HashSet、HashMap等)时出现逻辑异常。
解决方案
方案1:重写equals和hashCode方法(推荐)
在Employee类中添加如下两个方法,按照业务相等规则对比所有属性即可:
import java.util.Objects; // 类内添加以下方法 @Override public boolean equals(Object o) { // 内存地址相同直接判定相等 if (this == o) return true; // 类型不匹配直接判定不相等 if (o == null || getClass() != o.getClass()) return false; Employee employee = (Employee) o; // 逐一对比所有业务属性 return dependentId == employee.dependentId && covered == employee.covered && Objects.equals(eeId, employee.eeId) && Objects.equals(dateOfBirth, employee.dateOfBirth) && Objects.equals(fullName, employee.fullName) && Objects.equals(dependentType, employee.dependentType); } @Override public int hashCode() { return Objects.hash(dependentId, dateOfBirth, eeId, fullName, covered, dependentType); }
如果项目使用Lombok框架,直接给Employee类加@EqualsAndHashCode注解即可自动生成上述代码,无需手动编写。
方案2:Stream过滤(临时适配方案)
如果你暂时无法修改Employee类的代码,可以用Stream流式处理实现按属性匹配移除:
individualList = individualList.stream() .filter(emp -> individualList1.stream() .noneMatch(targetEmp -> emp.getDependentId() == targetEmp.getDependentId() && Objects.equals(emp.getEeId(), targetEmp.getEeId()) && Objects.equals(emp.getDateOfBirth(), targetEmp.getDateOfBirth()) && Objects.equals(emp.getFullName(), targetEmp.getFullName()) && emp.isCovered() == targetEmp.isCovered() && Objects.equals(emp.getDependentType(), targetEmp.getDependentType()) )) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Shiladittya Chakraborty
相关产品推荐
相关产品推荐

