example entry ejemplo java dictionary lambda java-8 comparator

entry - map java



Java 8 Map.Entry comparator (2)

He intentado hacer Map.Entry Comparator en Java8 usando expresiones lambda y he encontrado un comportamiento muy extraño.

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 funciona bien, pero com2 contiene un error " no se puede resolver el método getValue ". Y realmente no sé por qué? ¿Alguna sugerencia?

PS ¿Hay alguna forma de evitar escribir Map.Entry con Integer, String ? ¿Alguna forma más corta?


Actualmente, especifica el tipo sin formato cuando especifica la referencia al método; en el primer caso, la inferencia de tipo genérico con la asignación le dice al compilador qué quiere decir, pero eso no funciona para el objetivo de una llamada a un método. Sin embargo, puede especificar el tipo genérico para la referencia del método:

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

(Me doy cuenta de que está aumentando la cantidad de veces que necesita Map.Entry<Integer, String> en su código, pero desafortunadamente eso es difícil de evitar aquí).


Desde Java-8 hay un método independiente Entry.comparingByValue que se puede usar en su lugar:

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

Una forma alternativa de hacer lo mismo es pasar el parámetro:

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

De esta forma, los argumentos de tipo son innecesarios.