使用流畅的API打破类型推断

时间:2017-02-08 08:59:06

标签: java lambda type-inference

我尝试编写以下代码:

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()时,它不能。为什么呢?

2 个答案:

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