java - 具有不同对象类型的 removeAll 方法

标签 java collections

我有两个列表,我想对其执行批量操作,例如使用方法 removeAll、retainAll、contains。问题是这两个列表都有不同类型的对象,它们有一个相同的字段。很像

class ObjectType1{
  Long field1;
  String field2;
  String field3
 }

class ObjectType2{
Long field1;
String field4;
Long field5

所以list1包含ObjectType1的元素,list2包含ObjectType2。我想基于 field1 进行批量操作,这在两种对象类型中都很常见。

我正在考虑基于公共(public)字段在两个对象中实现 equals 方法。但后来认为仅在一个字段上进行相等可能是错误的,因为将来可能需要在 equals 方法中添加基于其他字段的比较。请建议。

希望我的问题已经足够清楚了。请让我知道澄清。

最佳答案

查看 Google 的 Guava 库。您可以使用 Collections2.transform为达到这个。以下是您如何执行 retainAll(),例如:

import com.google.common.base.Function;
import com.google.common.collect.Collections2;
...
List<ObjectType1> list1 = ...;
List<ObjectType2> list2 = ...;
Colection<Long> list1field1 = 
  Collections2.transform(list1, 
                         new Function<ObjectType1, Long>() {
                           public Long apply(ObjectType1 input) {
                             return (null == input) ? null : input.field1;
                           }
                         });
Collection<Long> list2field1 = 
  Collections2.transform(list2, ...);

// list1.retainAll(list2) based on field1 equivalence
list1field1.retainAll(list2field1); // this affects the underlying list, ie list1.

关于java - 具有不同对象类型的 removeAll 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14847238/

相关文章:

带有最后修改时间的Java集合数据结构

c# - 集合中项目的可观察集合属性发生了变化

java - Javafx 中的 SqLite 错误

java - 如何使用自签名证书从 Javascript 连接到 SSL 服务器?

java - 使用 "id"字段更新列表的子部分

java - 如何在 Netbeans 6.8 中为 JSF 1.2 中的 facelets 启用代码完成?

java - Spring & Wildfly 异步请求

java - Groovy 比较除第一项之外的两个集合

java - Producer/Consumer——生产者无阻塞地向集合中添加数据,消费者批量消费集合中的数据

java - 对将父方法映射到不同类的子类进行相同的删除