允许在 java 中传递不同的比较函数以在包含中使用的方法实用程序



我有一个类来表示数据库表中的每一行。因此,它有一些数据成员表示表中的主键,而其他数据成员是非键列。假设我有一个在某个时间点获取的行列表 (listA),然后在一段时间后,我获取了更多的行 (listB),其中可能包含之前获取的行,但在非键列中有一些更新的数据。我想合并列表 A 和列表 B 保留更新的值(即列表 B 中的内容)。此比较只需要检查键列。那么是否有任何实用程序(可能在番石榴或阿帕奇共享资源等中)包含/删除所有采用自定义比较函数的方法?
出于所有其他目的,我想检查类中的所有数据成员是否相等。
请注意,通常的 removeAll 将使用已被覆盖的等于和哈希码来比较类中的每个数据成员,我想使用不同的比较器,仅比较作为包含主键一部分的数据成员。

在你的类中,你只需要@Override公共布尔等于(Object obj)。这是List在测试包含(对象)时使用的方法。

您可以使用标准的 Java 集操作。如果您的"row"类没有使用主键信息实现equalshashCode,则可以使用一些包装器或实用程序类,例如:

class Row {
  Object pk, a, b;
  public boolean equals(Object other) {
    // Checks for other's type, etc.
    Row otherRow = (Row) other;
    return pk.equals(otherRow.pk) && a.equals(otherRow.a) && b.equals(otherRow.b);
  }
}
class PkInfo {
  final Row row;
  PkInfo(Row row) {
    this.row = row;
  }
  Row getRow() {
    return row;
  }
  public boolean equals(Object other) {
    // Checks for other's type, etc.
    PkInfo otherPkInfo = (PkInfo) other;
    return row.pk.equals(otherPkInfo.row.pk);
  }
  public int hashCode() {
    return row.pk.hashCode();
  }
}

因此,每当要合并结果集时,都可以执行以下操作:

// Your result sets
Collection<Row> listA, listB;
// Your primary-key-based sets
Set<PkInfo> pkiA = new HashSet<PkInfo>();
for (Row r : listA)
  pkiA.add(new PkInfo(r));
Set<PkInfo> pkiB = new HashSet<PkInfo>();
for (Row r : listB)
  pkiB.add(new PkInfo(r));
// Remove from A the rows present in B
pkiA.removeAll(pkiB);
// Modify listA
listA = new ...();
for (PkInfo pki : pkiA)
  listA.add(pki.getRow());
// Add all from listB
listA.addAll(listB);

您可以将上面的代码放在实用工具方法中,每当您想要使用来自另一个列表的新数据更新列表时,您都会调用该方法。

最新更新