С Java8 на Java7 - переносные компараторы - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблемы с пониманием того, как "перенести" простой компаратор в Java7.

Фактическая версия, которую я использую в Java8, выглядит следующим образом:

 private static final Comparator<Entry> ENTRY_COMPARATOR = Comparator.comparing(new Function<Entry, EntryType>() {
    @Override
    public EntryType apply(Entry t) {
        return t.type;
    }
})
        .thenComparing(Comparator.comparingLong(new ToLongFunction<Entry>() {
            @Override
            public long applyAsLong(Entry value) {
                return value.count;
            }
        }).reversed());

Но в сборкефаза я получаю эту ошибку:

static interface method invocations are not supported in -source 7

Как я могу перенести тот же компаратор на Java7?Я гуглю и ищу решение, но единственное, о чем я могу думать, это реализовать свой собственный класс в качестве реализации интерфейса Comparator.

Но если я пойду по этому пути, как я смогу применить оба варианта, сравнивая"," тогда сравнивая "и" обратный "в том же методе" сравнить "?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Даже вашу версию Java-8 можно сделать намного короче и проще для чтения с помощью:

Comparator.comparing(Entry::getType)
          .thenComparingLong(Entry::getCount)
          .reversed();

С guava (совместимым с Java-7), это выглядит немного более многословно:

    @Override
    public int compare(Entry left, Entry right) {
        return ComparisonChain.start()
                .compare(left.getType(), right.getCount(), Ordering.natural().reversed())
                .compare(left.getCount(), right.getCount(), Ordering.natural().reversed())
                .result();
    }
0 голосов
/ 18 декабря 2018

Вы можете создать Comparator<Entry> способ Java 7, после чего вы можете связать методы по умолчанию, как вы можете это сделать в Java 8, но без использования лямбда-выражений или ссылок на методы в качестве параметра:

private static final Comparator<Entry> ENTRY_COMPARATOR = new Comparator<Entry>() {
    @Override
    public int compare(Entry left, Entry right) {
        return left.type.compareTo(right.type);
    }
}
.thenComparingLong(new ToLongFunction<Entry>() {
    @Override
    public long applyAsLong(Entry entry) {
        return entry.value;
    }
})
.reversed();

Код выше скомпилирован с -source 1.7.

0 голосов
/ 18 декабря 2018

Логика может быть записана одним compare методом:

public int compare (Entry one,Entry two) {
    int result = two.getType().compareTo(one.getType());
    if (result == 0) {
        result = Long.compare(two.getCount(),one.getCount());
    }
    return result;
}

Обратите внимание, что обратный порядок достигается путем замены порядка сравниваемых Entry экземпляров.

...