如何使用CompareChain进行验证?

mem*_*und 2 java guava

com.google.common.collect.ComparatorChain用来为不同的对象实现自定义比较器。

现在,以下测试失败,但是为什么呢?

@Test
public void chainTest() {
    ComparisonChain comparator = ComparisonChain.start()
            .compare("a", "a");
    assertTrue(comparator.result() == 0);
    comparator.compare("a", "b");
    assertTrue(comparator.result() != 0); //fails with AssertionError
}
Run Code Online (Sandbox Code Playgroud)

Afaik的第二结果实际上应该!= 0a != b

我当然可以像这样重新分配比较器: comparator = comparator.compare("a", "b");

但这将丢弃重新分配前获得的任何结果。

Jon*_*eet 5

您忽略的返回值comparator.compare("a", "b")。调用compare()不会更改现有比较的状态-它会返回具有正确状态的比较(可能相同也可能不相同-只要比较结果为0,状态将为“活动”)。

更改代码以使用:

comparator = comparator.compare("a", "b");
Run Code Online (Sandbox Code Playgroud)

它应该工作。

这个想法是,您只是不断将比较传递给链,一旦知道整体结果(即其中一个非零时),它将忽略它们。例如:

import com.google.common.collect.ComparisonChain;

public class Test {   
    public static void main(String[] args) {
        int result = ComparisonChain.start()
            .compare("a", "b") // Chain terminates here
            .compare("a", "a") // Irrelevant
            .result();
        System.out.println(result); // < 0 (e.g. -1)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @membersound:我建议您提出一个新问题(而不是打扰这个问题)来表达您实际上想要实现的目标-因为这对我来说仍然*非常*不清楚。比较链的全部要点是将它*链接*-结果取决于之前的内容。 (3认同)