Вот мой общий компилятор Java 8.Вы можете сравнить любой T по функции f (T) -> R, например, Person (T) по дате рождения (R).Так как f может быть ссылкой на метод для получателя T, его легко сравнить с любым свойством (полем) T. Он обслуживает нулевые T и нулевые R (вы решаете, идут ли нулевые значения первым или последним), а также по возрастанию /в порядке убывания.Поскольку он использует естественный порядок из R, последний также должен реализовывать Comparable.См. Пример использования в конце кода.
public class CompareUtil {
public static enum Nulls {FIRST, LAST};
public static enum Order {ASCENDING, DESCENDING};
/** Return a Comparator of T on a function f(T) -> R */
public static <T, R extends Comparable<? super R>> Comparator<T> comparatorOf(
Function<T, R> function,
Order order,
Nulls nulls) {
Comparator<R> rComparator = Comparator.naturalOrder();
if (order == Order.DESCENDING) {
rComparator = rComparator.reversed();
}
rComparator = (nulls == Nulls.FIRST)?
Comparator.nullsFirst(rComparator) :
Comparator.nullsLast(rComparator);
Comparator<T> tComparator =
Comparator.comparing(
function, rComparator);
tComparator = (nulls == Nulls.FIRST)?
Comparator.nullsFirst(tComparator) :
Comparator.nullsLast(tComparator);
return tComparator;
}
//Example: construct a comparator that compares Events on event-date
//in descending date order, putting any nulls at the end of the result set
Comparator<Event> c = comparatorOf(Event::getDate, Order.DESCENDING, Nulls.LAST);