繁体   English   中英

Java 8 Map.Entry比较器

[英]Java 8 Map.Entry comparator

我一直在尝试使用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 ”。 我真的不知道为什么? 有什么建议?

PS有没有办法避免用Integer,String键入Map.Entry 任何更短的方式?

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

这种方式类型参数是不必要的。

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

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

(我知道这是增加你需要的次数Map.Entry<Integer, String>在你的代码,但不幸的是这是难以避免的在这里。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM