有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

字典Java8地图。输入比较器

我一直在努力制作地图。在Java8中使用lambda表达式的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”。我真的不知道为什么?有什么建议吗

另外,有没有办法避免键入Map。带有整数、字符串的条目?还有短一点的路吗


共 (2) 个答案

  1. # 1 楼答案

    因为Java-8有一个独立的方法^{},可以用它来代替:

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

    另一种方法是传递参数:

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

    这样就不需要类型参数

  2. # 2 楼答案

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

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

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