2013-12-11 3 views
3

Иногда мне приходится сравнивать список моих 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(); 
    } 

Не хочу писать велосипед :)

ответ

8

Вы, вероятно, хотите Apache Commons Lang CompareToBuilder.

+0

благодарственных лет, выглядит красиво. – omickron

+0

@omickron На самом деле, решение Guava, вероятно, лучше, если оно короткое замыкание. Материал Commons Lang классический, но стареющий. – chrylis

+0

Apache Commons Lang выглядит ближе ко мне :) – omickron

4

Попробуйте гуавы-х 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(); 
5

Java 8 имеют некоторые функции, которые позволяют строительство и цепные Компараторы:

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

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

+0

Спасибо, я не упоминал, мне нужно решение для Java 7. – omickron

+0

По крайней мере, вы на 7. Я ответил на вопрос от парня, который недавно застрял на 1.4. :-( –

+0

Бедный парень! Мне очень жаль тех людей, которым пришлось поддерживать версии 1.4 или 1.5. – omickron

Смежные вопросы