Java 番石榴比较为什么在第一次比较返回非零结果后不终止
番石榴中的比较链不应该懒散地评估比较吗?在下面的代码中,如果链不终止,NullComparator(apache)将返回一个非零值 从: 一旦其中一个返回非零结果,ComparisonChain实现就会停止调用其输入的compareTo和compare方法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)).
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();