gpt4 book ai didi

Java Lambda 和闭包

转载 作者:IT老高 更新时间:2023-10-28 20:51:05 31 4
gpt4 key购买 nike

我听说 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;
};

所以马上开始:

  • teamAteamB 在哪里输入?或者它们不是(就像某种奇怪形式的泛型)?
  • lambda 是闭包的类型,还是相反?
  • 与典型的匿名函数相比,这会给我带来什么好处?

最佳答案

Lambda 表达式只是实现目标接口(interface)的语法糖,这意味着您将通过 lambda 表达式在接口(interface)中实现特定方法。编译器可以推断接口(interface)中参数的类型,这就是为什么您不需要在 lambda 表达式中显式定义它们的原因。

例如:

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);

在这个表达式中,lambda表达式显然实现了一个字符串的Comparator,因此,这意味着lambda表达式是实现compare(String, String)的语法糖。

因此,编译器可以安全地假设 s1s2 的类型是 String

您的目标接口(interface)类型提供了编译器确定 lambda 参数的实际类型所需的所有信息。

Oracle Corportion 的 Java 语言架构师 Briant Goetz 发表了几篇关于 JDK 8 Lambda 正在进行的工作的文章。我相信您的问题的答案就在那里:

第二篇文章解释了 lambda 表达式是如何在字节码级别实现的,可能会帮助您深入研究第二个问题的细节。

关于Java Lambda 和闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404218/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com