2

番石榴中的比较链不应该懒惰地评估比较吗?在下面的代码中,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();
4

2 回答 2

5

没有什么可以阻止 Java 评估 的参数compare()即使该方法什么也不做。 x.getBytes()会抛出一个 NPE,因为xis null

也许这会奏效?

return Ordering.onResultOf(new Function<String, String>() {
            @Override
            public String apply(String input) {
                return input.getBytes().toString();
            }
        })
        .nullsFirst()
        .compare(x, y);

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

于 2014-07-16T23:52:41.713 回答
3

那是因为懒惰的是比较的调用,而不是对 x.getBytes() 的调用,因此是 NPE !IE:

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

或使用 Java 8:

ComparisonChain.start()
  .compare(x,y, new NullComparator(false))
  .compare(x, y, (a, b) -> a.getBytes().toString().compareTo(b.getBytes().toString()))
  .result();

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

于 2014-07-16T23:58:02.593 回答