Подтвердить что ты не робот

Компонент Java 8 Map.Entry

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

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();

com работает нормально, но com2 содержит недоразумение "не может разрешить метод getValue". И я действительно не знаю, почему? Любые предложения?

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

4b9b3361

Ответ 1

Так как 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());

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

Ответ 2

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

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

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