Java为什么使用“->”而不是“=>”来表示Lambda函数?

6

我是一名.NET和JavaScript开发者。现在我也在使用Java。
在.NET的LINQ和JavaScript的箭头函数中,我们使用=>

我知道Java的Lambda表达式不同,但它们非常相似。 Java选择->而不是=>是否有任何技术或非技术原因?

1个回答

17

2011年9月8日,Oracle的Brian Goetz在OpenJDK邮件列表中宣布,Java中lambda的语法已经基本确定,但一些“细节”仍未确定,比如使用哪种类型的箭头:

最新消息:EG(专家组)已经(大部分)决定了语法。

在考虑了许多替代方案后,我们决定基本上采用C#语法。我们可能还需要进一步讨论一些细节(例如,使用细箭头还是粗箭头,特殊的nilary形式等),并且尚未就方法引用语法达成决定。

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

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

他继续提供了委员会考虑的一些理由的描述:

You could think of this in two ways (I'm sure I'll hear both):

  • This is much better, as it avoids some really bad interactions with existing operators, such as:

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

    or

    Predicate p = x => x.size == 0;  // duelling equals
    
  • What a bunch of idiots we are, in that we claimed the goal of doing what other languages did, and then made gratuitous changes "just for the sake of doing something different".

Obviously we don't think we're idiots, but everyone can have an opinion :)

In the end, this was viewed as a small tweak to avoid some undesirable interactions, while preserving the overall goal of "mostly looks like what lambdas look like in other similar languages."

Howard Lovatt 表示赞同优先选择 ->,并写道他“阅读 Scala 代码时遇到了麻烦”。Apache 的 Paul Benedict 同意这一观点:

我也很高兴。与其他语言保持一致是一个值得称赞的目标,但由于编程语言并不相同,Java 的需求可能会导致不同的结论。箭头符号看起来确实有些奇怪;我承认这一点。因此,从虚荣心的角度来看,我很高兴看到这个问题被解决了。等于号太容易与赋值和相等联系在一起了。

Paigan Jadoth 也加入了讨论:

我认为“->”比“=>”更好。如果使用箭头而不是更常见的“#(){...}”模式,那么明显需要与“gte/lte”标记有所区别。而且,“因为其他人这样做”从来都不是一个好的论据,哈哈。

综上所述,在考虑双方的论点后,委员会认为,与其他语言的一致性(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 外,在该邮件列表中,我没有看到任何批评选择 -> 并捍卫 => 的人。当然,就像 Brian 预测的那样,双方几乎肯定都有意见,但最终在这些问题上必须做出选择,委员会根据所述原因做出了他们的选择。

这就是英语的多样性。在我的词典中,“to punt”意味着乘坐平底船在河上旅行。当保罗·本尼迪克特说“我很高兴看到那被踢走了”,他可能是指“被踢开了”。 - Ole V.V.
1
我相信你对保罗的陈述的解释是正确的,@Ole。但就英语而言,情况实际上更糟。有一个相对常见的隐喻(来自美式橄榄球比赛),其中“punt”意味着“暂时忽略”。从技术上讲,它与“kicked away”的意思相同,但它意味着避免做出决定(例如,因为问题过于棘手,两个选项都没有明显的优势)。 - Cody Gray
感谢 @CodyGray 提供更多背景来理解这个表达式。这确实很有启发性。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接