Java 8 Map.Entry 比较器
Java 8 Map.Entry comparator
我一直在尝试使用 lambda 表达式在 Java8 中创建 Map.Entry 比较器 ,但发现了一个非常奇怪的行为。
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。有什么办法可以避免用 Integer, String 输入 Map.Entry 吗?还有更短的路吗?
目前您在指定方法引用时指定了原始类型 - 在第一种情况下,带有赋值的泛型类型推断会告诉编译器您的意思,但这不适用于方法调用的目标.您可以为方法引用指定通用类型:
Comparator<Map.Entry<Integer, String>> com2 =
Comparator.comparing(Map.Entry<Integer,String>::getValue).reversed();
(我意识到这 增加了 您在代码中需要 Map.Entry<Integer, String>
的次数,但不幸的是,这在此处很难避免。)
因为 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());
这种方式不需要类型参数。
我一直在尝试使用 lambda 表达式在 Java8 中创建 Map.Entry 比较器 ,但发现了一个非常奇怪的行为。
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。有什么办法可以避免用 Integer, String 输入 Map.Entry 吗?还有更短的路吗?
目前您在指定方法引用时指定了原始类型 - 在第一种情况下,带有赋值的泛型类型推断会告诉编译器您的意思,但这不适用于方法调用的目标.您可以为方法引用指定通用类型:
Comparator<Map.Entry<Integer, String>> com2 =
Comparator.comparing(Map.Entry<Integer,String>::getValue).reversed();
(我意识到这 增加了 您在代码中需要 Map.Entry<Integer, String>
的次数,但不幸的是,这在此处很难避免。)
因为 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());
这种方式不需要类型参数。