compareTo:将两个空值视为相等
compareTo: treat two nulls as equal
我希望我的比较方法能够工作,以便在两个对象中的 field1 == null 的情况下,不会确定比较,但会检查 field2,依此类推。如何以最简单的方式做到这一点?下面的方法效果不佳:当两个对象的字段都为空时,总是确定比较(没有 Ordering.natural().NullsFirst()
我得到 NPE):
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class MyClass implements Comparable<MyClass> {
String field1;
Integer field2;
String field3;
@Override
public int compareTo(MyClass myClass) {
return ComparisonChain.start()
.compare(field1, myClass.field1, Ordering.natural().nullsFirst())
.compare(field2, myClass.field2, Ordering.natural().nullsFirst())
.compare(field3, myClass.field3, Ordering.natural().nullsFirst())
.result();
}
}
将 Ordering.natural().nullsFirst()
作为第三个参数是预期的方式。
documentation 显示得相当清楚:
public int compareTo(Foo that) {
return ComparisonChain.start()
.compare(this.aString, that.aString)
.compare(this.anInt, that.anInt)
.compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
.result();
}
此外,ComparisonChain
在com.google.common.collect
中,即annotated with @ParametersAreNonnullByDefault
,这里是自定义对象使用的两个比较方法的完整定义:
abstract ComparisonChain compare(Comparable left, Comparable right)
和
abstract <T extends @Nullable Object> ComparisonChain compare(T left, T right, Comparator comparator)
第一个没有任何用 @Nullable
标记的参数,而第二个有顺序标记。
因此,没有更简单的方法来做您所做的事情。
我希望我的比较方法能够工作,以便在两个对象中的 field1 == null 的情况下,不会确定比较,但会检查 field2,依此类推。如何以最简单的方式做到这一点?下面的方法效果不佳:当两个对象的字段都为空时,总是确定比较(没有 Ordering.natural().NullsFirst()
我得到 NPE):
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class MyClass implements Comparable<MyClass> {
String field1;
Integer field2;
String field3;
@Override
public int compareTo(MyClass myClass) {
return ComparisonChain.start()
.compare(field1, myClass.field1, Ordering.natural().nullsFirst())
.compare(field2, myClass.field2, Ordering.natural().nullsFirst())
.compare(field3, myClass.field3, Ordering.natural().nullsFirst())
.result();
}
}
将 Ordering.natural().nullsFirst()
作为第三个参数是预期的方式。
documentation 显示得相当清楚:
public int compareTo(Foo that) { return ComparisonChain.start() .compare(this.aString, that.aString) .compare(this.anInt, that.anInt) .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) .result(); }
此外,ComparisonChain
在com.google.common.collect
中,即annotated with @ParametersAreNonnullByDefault
,这里是自定义对象使用的两个比较方法的完整定义:
abstract ComparisonChain compare(Comparable left, Comparable right)
和
abstract <T extends @Nullable Object> ComparisonChain compare(T left, T right, Comparator comparator)
第一个没有任何用 @Nullable
标记的参数,而第二个有顺序标记。
因此,没有更简单的方法来做您所做的事情。