【发布时间】:2015-12-09 21:32:19
【问题描述】:
import java.util.*;
class TreeMapDemo
{
public static void main(String args[])
{
Comparator <String> c1 = (str1, str2) -> 0;
Comparator <String> c2 = (str1, str2) -> 1;
TreeMap <String, Double> tm1 = new TreeMap(c1.thenComparing(c2));
//Working fine
TreeMap <String, Double> tm2 = new TreeMap(((str1, str2) -> 0).thenComparing((str1, str2) -> 1));
//Error: Lambda expression not expected here
//<none> can not be dereferenced
}
}
我的查询是:
如果
c1 = (str1, str2) -> 0和c2 = (str1, str2) -> 1,
那为什么
c1.thenComparing(c2) 工作正常,并且
((str1, str2) -> 0).thenComparing((str1, str2) -> 1)不是吗?
【问题讨论】:
-
Lambda 表达式不是比较器。
thenComparing是一个比较器方法。 -
@alfasin : 如果不是比较器,那么它是如何与 TreeMap 构造函数映射的
-
不是,你(应该)得到的编译错误是:“这里不需要 lambda 表达式”。您可能已经发现您可以将它转换为比较器,它会编译得很好(呃...)
-
因为必须是 Comparator 类型的整个表达式,而不是调用
thenComparing的对象。如果我扩展BiFunction<String, String, Integer>并添加一个返回Comparator的默认方法thenComparing它会变得模棱两可。 -
除了您遇到的任何错误之外,始终返回 1 的
Comparator不可能是正确的。比较器必须是对称的,这意味着如果c.compare(x,y)返回 1,那么c.compare(y,x)必须返回负数。此外,c.compare(x,x)必须返回 0。如果您使用违反这些规则的Comparator,并且您尝试在sort或其他内容中使用它,那么算法将失去理智。
标签: java lambda java-8 dereference dot-operator