假设我有两个对象,并且想知道一个特定的属性是否相等(null完全按照我的意愿进行管理):

// pre java 8

public static boolean equalsProp(SomeObject a, SomeObject b)
{
    Object aProp = a != null ? a.getProp() : null;
    Object bProp = b != null ? b.getProp() : null;

    return  (aProp == bProp) || (aProp != null && aProp.equals(bProp));
}


现在我有了Java 8,我可以将其重写为通用的:

public static <T, U> boolean equals(T a, T b, Function<? super T, ? extends U> mapper)
{
    Object aProp = Optional.ofNullable(a).map(mapper).orElse(null);
    Object bProp = Optional.ofNullable(b).map(mapper).orElse(null);

    return (aProp == bProp) || (aProp != null && aProp.equals(bProp));
}


但是我不喜欢在我的一个类中定义这样的方法。

是否有java.lang.something.SomeJreBundledClass.equals(a, b, func)可以做到这一点?

是否有关于如何执行此操作的最佳实践(可能没有实用程序方法)?



也许不清楚我要问什么,我会再试一次。

我有这段代码:

Table t1 = ...
Table t2 = ...

if(!my.package.utils.ObjectUtils.equals(t1, t2, Table::getPrimaryKey))
{
    // ok, these tables have different primary keys
}


我问是否:


有一个JRE类可以完成my.package.utils.ObjectUtils的工作
有一种更好的,简短的且可以容忍的方法来比较t1.primaryKeyt2.primaryKey,而无需编写实用程序方法。

最佳答案

我问是否:
  
  
  有一个JRE类可以完成my.package.utils.ObjectUtils的工作
  有一种更好的,简短的且可以容忍的方法来比较t1.primaryKeyt2.primaryKey,而无需编写实用程序方法。
  


对于第一个问题,答案是否定的。

对于第二个问题,除非您已经准备好让您的代码对对象进行比较比较黑,否则“否”也是答案。

您要表达的是等效性。几个框架可以帮助您使用该上下文。其中最著名的是Guava及其Equivalence类/框架。在这种情况下,您不必编写实用程序方法,因为它们存在于其他地方。

09-30 15:17