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();
}

此外,ComparisonChaincom.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 标记的参数,而第二个有顺序标记。

因此,没有更简单的方法来做您所做的事情。