假设我有两个对象,并且想知道一个特定的属性是否相等(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.primaryKey
和t2.primaryKey
,而无需编写实用程序方法。 最佳答案
我问是否:
有一个JRE类可以完成my.package.utils.ObjectUtils
的工作
有一种更好的,简短的且可以容忍的方法来比较t1.primaryKey
和t2.primaryKey
,而无需编写实用程序方法。
对于第一个问题,答案是否定的。
对于第二个问题,除非您已经准备好让您的代码对对象进行比较比较黑,否则“否”也是答案。
您要表达的是等效性。几个框架可以帮助您使用该上下文。其中最著名的是Guava及其Equivalence
类/框架。在这种情况下,您不必编写实用程序方法,因为它们存在于其他地方。