我尝试编写以下代码:
Map<String, String> m = new HashMap<>();
// ... populate the map
m.entrySet().stream()
.sorted(Comparator.comparing(e -> e.getKey()).reversed())
.forEach(System.out::println);
这不会编译,因为e
的推断类型是Object
。但是,如果我删除.reversed()
调用,推理就会起作用。我必须拼出e
的类型,这是丑陋的:
.sorted(Comparator.comparing((Map.Entry<String, String> e) -> e.getKey()).reversed())
编译器可以推断Comparator.comparing
的类型,但是当我添加reversed()
时,它不能。为什么呢?
答案 0 :(得分:1)
This answer解释了为什么它没有编译。
您有几种方法可以修复代码:
//cheat a bit
.sorted(Entry.comparingByKey(Comparator.reverseOrder()))
//provide the target type
.sorted(Entry.<String, String> comparingByKey().reversed())
//explicitly give the type of e
.sorted(Comparator.comparing((Entry<String, String> e) -> e.getKey()).reversed())
答案 1 :(得分:0)
您在这里使用的静态方法
Comparator.comparing()
是一个通用方法,但是你没有在这里指定,它作为参数需要什么,它返回什么 - 它需要在某处指定。
我的建议是一个小小的改动,将施放e
替换为Map.Entry
,这可能看起来更好
Map<String, String> m = new HashMap<>();
// ... populate the map
m.entrySet().stream()
.sorted(Comparator.<Map.Entry<String, String>, String>comparing(Map.Entry::getKey).reversed())
.forEach(System.out::println);