问题描述
Lambda表达式只是用于实现目标接口的语法糖,这意味着您将通过lambda表达式在接口中实现特定方法。编译器可以推断接口中参数的类型,这就是为什么您不需要在lambda表达式中显式定义它们的原因。
例如:
Comparator<String> c = (s1, s2) -> s1.comparetoIgnoreCase(s2);
在此表达式中,lambda表达式显然实现了Comparator
字符串a,因此,这意味着lambda表达式是用于实现的语法糖compare(String,
String)
。
因此,编译器可以安全地假设s1
and 类型s2
为String
。
您的目标接口类型提供了编译器确定lambda参数的实际类型需要的所有信息。
Oracle Corportion的Java语言架构师Briant Goetz发表了一些有关JDK 8 Lambdas正在进行的工作的文章。我相信您的问题的答案在那里:
第二篇文章介绍了如何在字节码级别实现lambda表达式,并可以帮助您深入研究第二个问题的细节。
解决方法
我听说lambda即将传到您附近的Java(J8)。我在某个博客上找到了一个示例,说明了它们的外观:
SoccerService soccerService = (teamA,teamB) -> {
SoccerResult result = null;
if (teamA == teamB) {
result = SoccerResult.DRAW;
}
else if(teamA < teamB) {
result = SoccerResult.LOST;
}
else {
result = SoccerResult.WON;
}
return result;
};
所以马上开始:
- 在哪里
teamA
和teamB
类型?还是不是(像某种奇怪的泛型形式)? - Lambda是 一种 封闭 类型 ,还是相反?
- 与典型的匿名功能相比,这将给我带来什么好处?