Java 8 Map.Entry comparisonator

2022-09-03 17:06:31

我一直在尝试使用lambda表达式在Java8中制作Map.Entry Comparator,并发现了一个非常奇怪的行为。

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 with Integer, String?更短的方式吗?


答案 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

目前,您在指定方法引用时指定原始类型 - 在第一种情况下,具有赋值的泛型类型推断会告诉编译器您的意思,但这不适用于方法调用的目标。不过,您可以为方法引用指定泛型类型:

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

(我意识到这会增加代码中需要的次数,但不幸的是,这在这里很难避免。Map.Entry<Integer, String>