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.