为什么Java对lambda函数使用->而不是=>?

我是 .NET 和 JavaScript 开发人员。现在我也在用 Java 工作。在 .NET LINQ 和 JavaScript 箭头函数中,我们有=>.

我知道 Java lambdas 不一样,但它们非常相似。是否有任何原因(技术或非技术)让 java 选择->而不是=>

回答

2011 年 9 月 8 日,Oracle 的 Brian Goetz 向 OpenJDK 邮件列表宣布,Java 中 lambdas 的语法已经基本确定,但一些“要点”(例如使用哪种类型的箭头)仍然悬而未决:

这只是在:EG 已经(大部分)对语法做出了决定。

在考虑了许多替代方案后,我们决定本质上采用 C# 语法。我们可能仍会进一步考虑细节(例如,细箭头与粗箭头、特殊的 nilary 形式等),并且尚未就方法引用语法做出决定。

2011 年 9 月 27 日,Brian 发布了另一个更新,宣布->将使用箭头,优先于 C#(和 Java 原型)使用=>

语法更新:EG 选择坚持使用原型当前使用的箭头的 -> 形式,而不是采用 =>。

他接着对委员会考虑的理由进行了一些描述:

您可以通过两种方式来思考这一点(我相信我会同时听到这两种声音):

  • 这要好得多,因为它避免了与现有运算符的一些非常糟糕的交互,例如:

    x => x.age <= 0;                 // duelling arrows
    

    或者

    Predicate p = x => x.size == 0;  // duelling equals
    
  • 我们真是一群白痴,因为我们声称目标是做其他语言所做的事情,然后“只是为了做一些不同的事情”而进行了无偿的更改。

显然我们不认为我们是白痴,但每个人都可以有意见:)

最后,这被视为避免一些不受欢迎的交互的小调整,同时保留了“主要看起来像其他类似语言中的 lambda 表达式”的总体目标。

霍华德·洛瓦特 (Howard Lovatt) 回复同意更喜欢 的决定->,并写道他“阅读 Scala 代码有困难”。Apache 的 Paul Benedict 表示同意:

我也很高兴。与其他语言保持一致是一个值得称赞的目标,但由于编程语言并不相同,对 Java 的需求可能会导致不同的结论。粗箭头语法看起来很奇怪;我承认。因此,就虚荣心而言,我很高兴看到它被搁置。equals 字符与赋值和相等关系太紧密了。

Paigan Jadoth 也插话道:

我发现“->”比“=>”好得多。如果根本不使用箭头而不是更常规的“#(){...}”模式,那么与 gte/lte 标记明显不同的东西显然更好。无论如何,“因为其他人这样做”从来都不是一个好的论点:D。

总而言之,在考虑了双方的论点后,委员会认为与其他语言(=>在 Scala 和 C# 中使用)的一致性不如与相等运算符的明显区别更引人注目,这使得->胜出

但Lieven Lemiengre持怀疑态度:

其他语言(例如 Scala 或 Groovy)没有这个问题,因为它们支持一些占位符语法。

实际上你不会写“x => x.age <= 0;” 但这是非常常见的“someList.partition(x => x.age <= 18)”,我同意这看起来很糟糕。其他语言使用占位符语法“someList.partition(_.age <= 18)”或“someList.partition(it.age <= 18)”使这一点更加清晰我希望你正在考虑这样的事情,这些小闭包将被使用很多!
(而且我不认为用 '->' 替换 '=>' 会有很大帮助)

除了 Lieven,我没有看到任何人批评->和捍卫=>在该邮件列表上回复的选择。当然,正如布赖恩预测的那样,几乎可以肯定双方都有意见,但最终,只能在这些类型的问题上做出选择,委员会出于上述原因做出了他们所做的选择。


以上是为什么Java对lambda函数使用-&gt;而不是=&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>