假设我有两个对象,并且我想知道特定属性是否相等(空值完全按照我的意愿管理):
// 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
}
我在问:
my.package.utils.ObjectUtils
的工作t1.primaryKey
和t2.primaryKey
,而无需编写实用程序方法。答案 0 :(得分:1)
使用流来考虑这个:
static class MyClass {
String prop;
public String getProp(){
return prop;
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
MyClass a = new MyClass();
MyClass b = new MyClass();
a.prop = "foo";
b.prop = "foo";
boolean e = Stream.of(a,b).filter(Objects::nonNull).map(MyClass::getProp).distinct().count() != 2;
System.out.println("e = " + e);
a = null;
b = null;
e = Stream.of(a,b).filter(Objects::nonNull).map(MyClass::getProp).distinct().count() != 2;
System.out.println("e = " + e);
}
答案 1 :(得分:1)
我问是否:
- 有一个 JRE 类可以完成
my.package.utils.ObjectUtils
的工作- 在没有编写实用程序方法的情况下,比较
t1.primaryKey
和t2.primaryKey
是一种更好,更短且容忍的方法。
对于您的第一个问题,否就是答案。
对于您的第二个问题,否也是答案,除非您准备让您的代码非常苛刻地比较对象。
你要表达的是等同性。几个框架可以帮助您使用该上下文。其中最值得注意的是具有Equivalence
类/框架的番石榴。在这种情况下,你不必编写实用程序方法,因为它们存在于其他地方。
答案 2 :(得分:1)
也许你可以使用这样的东西:
Comparator.comparing(SomeObject::getProp).compare(a, b) == 0
Comparator.comparing(Table::getPrimaryKey).compare(table1, table2) == 0