【问题标题】:Compare utils for Comparators比较器的比较器
【发布时间】:2013-12-29 02:58:55
【问题描述】:

有时我必须使用多个字段来比较我的 POJO 列表,例如,首先通过 boolean isExternal() 字段,然后通过 String getName() 字段。

我想知道是否有已知的比较实用程序可以做到这一点?

代码片段:

    @Override
    public int compare( CompanyProject o1, CompanyProject o2 ) {
        return CompareBuilder.compareBoolean(o1.isExternal(), o2.isExternal()).compareString(o1.getName(), o2.getName()).getResult();
    }

不想写自行车:)

【问题讨论】:

    标签: java compare comparator


    【解决方案1】:

    您可能想要 Apache Commons Lang CompareToBuilder

    【讨论】:

    • @omickron 实际上,如果短路,Guava 解决方案可能会更好。 Commons Lang 的东西很经典,但很陈旧。
    • Apache Commons Lang 看起来离我更近 :)
    【解决方案2】:

    试试 Guava 的ComparisonChain:

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

    【讨论】:

      【解决方案3】:

      Java 8 有一些函数允许比较器的构造和链接:

      Comparator.comparing(Pojo::isExternal)
                .thenComparing(Pojo::getName);
      

      http://download.java.net/jdk8/docs/api/java/util/Comparator.html

      【讨论】:

      • 谢谢,我没有提到,我需要 Java 7 的解决方案。
      • 至少你在 7。我回答了一个最近卡在 1.4 上的人的问题。 :-(
      • 可怜的家伙!对于那些不得不支持 1.4 或 1.5 版本的人,我真的很抱歉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2014-06-12
      • 2023-01-13
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多