可选<T>的比较器

cod*_*ker 5 java generics guava

我有 abstract class OptionalComparator<T extends Comparable<T>> implements Comparator<Optional<T>>

到现在为止还挺好.

遵循Optional本身使用的模型,我认为最好有一个这个类的单个实例,并在必要时(例如,to OptionalComparator<Integer>)进行转换.

所以我做了private static final OptionalComparator<? extends Comparable<?>> ABSENT_FIRST.

当我试图分配一个值时出现了麻烦.该类型应该是什么?

new OptionalComparator<Comparable<Object>>() {...} 不起作用.

new OptionalComparator<Comparable<Comparable<Object>>>() {...} 不起作用.

new OptionalComparator<Integer>() {...} 确实有用,但我想要最不具体的类型.

我究竟做错了什么?如何创建此类的基本案例实例?

And*_*ira 7

您可以有多个这样的实现OptionalComparator:

private static final OptionalComparator<? extends Comparable<?>> ABSENT_FIRST = new AbsentFirst<>();

private static final OptionalComparator<? extends Comparable<?>> ABSENT_LAST = new AbsentLast<>();

private interface OptionalComparator<T extends Comparable<T>> extends Comparator<Optional<T>> { }

private static class AbsentFirst<T extends Comparable<T>> implements OptionalComparator<T> {
    @Override
    public int compare(Optional<T> obj1, Optional<T> obj2) {
        if (obj1.isPresent() && obj2.isPresent()) {
            return obj1.get().compareTo(obj2.get());
        } else if (obj1.isPresent()) {
            return -1;
        } else if (obj2.isPresent()) {
            return 1;
        } else {
            return 0;
        }
    }
}

private static class AbsentLast<T extends Comparable<T>> implements OptionalComparator<T> {
    @Override
    public int compare(Optional<T> obj1, Optional<T> obj2) {
        if (obj1.isPresent() && obj2.isPresent()) {
            return obj1.get().compareTo(obj2.get());
        } else if (obj1.isPresent()) {
            return 1;
        } else if (obj2.isPresent()) {
            return -1;
        } else {
            return 0;
        }
    }
}

static <T extends Comparable<T>> OptionalComparator<T> absentFirstComparator() {
    @SuppressWarnings("unchecked")
    OptionalComparator<T> comp = (OptionalComparator<T>) ABSENT_FIRST;
    return comp;
}

static <T extends Comparable<T>> OptionalComparator<T> absentLastComparator() {
    @SuppressWarnings("unchecked")
    OptionalComparator<T> comp = (OptionalComparator<T>) ABSENT_LAST;
    return comp;
}

public static void main(String... args) {
    OptionalComparator<Integer> absentFirstInt = absentFirstComparator();
    System.out.println(absentFirstInt.compare(Optional.of(1), Optional.empty()));

    OptionalComparator<Integer> absentLastInt = absentLastComparator();
    System.out.println(absentLastInt.compare(Optional.of(1), Optional.empty()));

    OptionalComparator<Double> absentFirstDouble = absentFirstComparator();
    System.out.println(absentFirstDouble.compare(Optional.of(1.0), Optional.empty()));

    OptionalComparator<Double> absentLastDouble = absentLastComparator();
    System.out.println(absentLastDouble.compare(Optional.of(1.0), Optional.empty()));
}
Run Code Online (Sandbox Code Playgroud)

输出:

-1
1
-1
1
Run Code Online (Sandbox Code Playgroud)


Oli*_*oux 6

Guava现在提供了(从21.0开始,并且从27.1开始没有更多的@Beta)和。Comparators.emptiesLast(Comparator)emptiesFirst(Comparator)

例: Comparator<Optional<Instant>> compareOptInst = Comparators.emptiesLast(Comparator.naturalOrder());