2015-08-10 8 views
13

Я пытался сделать Map.Entry Comparator в Java8 с использованием лямбда-выражений и нашел очень странное поведение.Java 8 Map.Entry компаратор

Map<Integer, String> map = new TreeMap<>(); 

map.put(1, "Hello"); 
map.put(3, "zzzz"); 
map.put(2, "aaaa"); 
map.put(5, "AAAAA"); 
map.put(4, "aaaa"); 

Comparator<Map.Entry<Integer, String>> com = Comparator.comparing(Map.Entry::getValue); 
com = com.reversed(); 

Comparator<Map.Entry<Integer, String>> com2 = Comparator.comparing(Map.Entry::getValue).reversed(); 

ком работает просто отлично, но com2 содержит misstake "не может решить метод ПолучитьЗначение". И я действительно не знаю, почему? Какие-либо предложения?

P.S. Есть ли способ избежать ввода Map.Entry с Integer, String? Какой-нибудь более короткий путь?

+0

Это, по-видимому, является ограничением того, как компилятор Java передает общие параметры и тип возврата лямбда, поэтому, вероятно, здесь мало что можно сделать. Вы можете дождаться следующей версии компилятора, которая может быть более умной. :) – biziclop

ответ

19

Так как Java-8, существует метод, автономный Entry.comparingByValue, который может быть использован вместо:

Comparator<Map.Entry<Integer, String>> com2 = 
     Map.Entry.<Integer, String>comparingByValue().reversed(); 

альтернативный способ сделать то же самое, чтобы передать параметр:

Comparator<Map.Entry<Integer, String>> com2 = 
     Map.Entry.comparingByValue(Comparator.reverseOrder()); 

Этот аргумент типа типа не нужен.

14

В настоящее время вы указываете необработанный тип при указании ссылки на метод - в первом случае вывод типового типа с присваиванием сообщает компилятору, что вы имеете в виду, но это не работает для цели вызова метода. Вы можете указать общий тип для ссылки на метод, хотя:

Comparator<Map.Entry<Integer, String>> com2 = 
    Comparator.comparing(Map.Entry<Integer,String>::getValue).reversed(); 

(. Я понимаю, что это увеличение количество раз, вам нужно в коде Map.Entry<Integer, String>, но, к сожалению, трудно избежать здесь)

+0

Спасибо, чем определенно сработало! Хотя Intellij показывает то же предупреждение. Но могу ли я не печатать много Map.Entry ? –

+1

@ ДмитрийКиселев: Вы можете * уйти от него, написав свои собственные методы утилиты, которые называют 'reverse', но они были бы уродливыми другими способами ... –