Java 番石榴比较为什么在第一次比较返回非零结果后不终止

Java 番石榴比较为什么在第一次比较返回非零结果后不终止,java,guava,comparisonchain,Java,Guava,Comparisonchain,番石榴中的比较链不应该懒散地评估比较吗?在下面的代码中,如果链不终止,NullComparator(apache)将返回一个非零值 从: 一旦其中一个返回非零结果,ComparisonChain实现就会停止调用其输入的compareTo和compare方法 String x = null; String y = "y"; ComparisonChain.start().compare(x,y, new NullComparator(false)).

番石榴中的比较链不应该懒散地评估比较吗?在下面的代码中,如果链不终止,NullComparator(apache)将返回一个非零值

从: 一旦其中一个返回非零结果,ComparisonChain实现就会停止调用其输入的compareTo和compare方法

    String x = null;
    String y = "y";
    ComparisonChain.start().compare(x,y, new NullComparator(false)).
            compare(x.getBytes().toString(), y.getBytes().toString()).result();
注:以上只是一个例子。也许这是一个更好的例子

ComparisonChain.start().compare(x,y, new NullComparator(false)).
        compare(x.getBytes(), y.getBytes(), UnsignedBytes.lexicographicalComparator()).result();

没有任何东西可以阻止Java计算
compare()
的参数,即使该方法什么也不做
x.getBytes()
将抛出NPE,因为
x
null

也许这样行得通

return Ordering.onResultOf(new Function<String, String>() {
            @Override
            public String apply(String input) {
                return input.getBytes().toString();
            }
        })
        .nullsFirst()
        .compare(x, y);
returnordering.onResultOf(新函数(){
@凌驾
公共字符串应用(字符串输入){
返回input.getBytes().toString();
}
})
.nullsFirst()
.比较(x,y);

请记住,
input.getBytes().toString()
排序可能没有多大意义(它看起来像
[B@35c41b
)。

这是因为延迟的是对比较的调用,而不是对x.getBytes()的调用,因此是NPE! 即:


注意,比较
getBytes().toString()
在实际情况下可能不是一个好主意…

你怎么知道它不会终止?在第二只眼睛上抛出一个npe,谢谢你的注释。这只是一个例子;)谢谢,接受了另一个答案,因为排序。on是我要找的。是的,我使用的是UnsignedBytes.lexicographicalComparator。这只是一个简单的例子足够了,我会在问题中澄清
ComparisonChain.start()
  .compare(x,y, new NullComparator(false))
  .compare(x.getBytes().toString(), y.getBytes().toString()) // <-- tries to invoke compare with two objects
  .result();
ComparisonChain.start()
  .compare(x,y, new NullComparator(false))
  .compare(x, y, new Comparator<String>() {
    int compare(String a, String b) {
      return a.getBytes().toString().compareTo(b.getBytes().toString());
    }
  })
  .result();
ComparisonChain.start()
  .compare(x,y, new NullComparator(false))
  .compare(x, y, (a, b) -> a.getBytes().toString().compareTo(b.getBytes().toString()))
  .result();