【发布时间】:2019-04-12 14:21:20
【问题描述】:
在初始化 TreeMap、TreeSet 等集合时,我们可以添加自定义比较器。
代码如下所示:
Map<Integer, String> map1 = new TreeMap<>(new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
return x-y;
}
});
现在,我们可以用 lambda 表达式替换这个匿名实现。代码如下所示:
Map<Integer, String> map2 = new TreeMap<>((x,y) -> x-y);
Java-8 允许您通过functional interfaces 将 lambda 表达式存储在变量中。所以,我将上面的代码修改为:
BiFunction<Integer, Integer, Integer> myComparator = (x,y) -> x-y;
Map<Integer, String> map3 = new TreeMap<>(myComparator);
但是最后一次尝试没有成功!它给出了以下错误:
无法推断 TreeMap 的类型参数
为什么在上一个示例中解析类型失败?
注意:为了确认这不是 IDE 错误,我使用 javac 执行了原始编译,但仍然给出了相同的错误。
【问题讨论】:
-
您不能将您的 lambda 函数声明为
Comparator<Integer> myComparator = (x,y) -> x-y;而不是BiFunction吗?因为Comparator明确是TreeMap构造函数需要的类型。 -
我得到一个“无法解析构造函数....”.
-
@luk2302,你用的是哪个版本的java?
-
@khelwood 有效!!。但不幸的是并没有解决问题。
-
无论你实现了哪种逻辑,都不要使用减号。
Integer.compare(int,int)做正确的事,但通常,当您最终比较两个int值时,您可以使用Comparator.naturalOrder()、Comparator.reverseOrder()、Comparator.comparingInt(…)或它们的组合。
标签: java generics lambda java-8 functional-interface