我是一名.NET和JavaScript开发者。现在我也在使用Java。
在.NET的LINQ和JavaScript的箭头函数中,我们使用=>
。
我知道Java的Lambda表达式不同,但它们非常相似。 Java选择->
而不是=>
是否有任何技术或非技术原因?
2011年9月8日,Oracle的Brian Goetz在OpenJDK邮件列表中宣布,Java中lambda的语法已经基本确定,但一些“细节”仍未确定,比如使用哪种类型的箭头:
最新消息:EG(专家组)已经(大部分)决定了语法。
在考虑了许多替代方案后,我们决定基本上采用C#语法。我们可能还需要进一步讨论一些细节(例如,使用细箭头还是粗箭头,特殊的nilary形式等),并且尚未就方法引用语法达成决定。
2011年9月27日,Brian发布了另一个更新, 宣布将使用->
箭头,而不是C#(和Java原型)使用的=>
:
语法更新:EG选择坚持使用原型当前使用的->箭头形式,而不是采用=>。
他继续提供了委员会考虑的一些理由的描述:
Howard Lovatt 表示赞同优先选择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."
->
,并写道他“阅读 Scala 代码时遇到了麻烦”。Apache 的 Paul Benedict 同意这一观点:
Paigan Jadoth 也加入了讨论:我也很高兴。与其他语言保持一致是一个值得称赞的目标,但由于编程语言并不相同,Java 的需求可能会导致不同的结论。箭头符号看起来确实有些奇怪;我承认这一点。因此,从虚荣心的角度来看,我很高兴看到这个问题被解决了。等于号太容易与赋值和相等联系在一起了。
综上所述,在考虑双方的论点后,委员会认为,与其他语言的一致性(Scala 和 C# 中使用“=>”)不如与等号操作符有明显的区别,因此选择了“->”。我认为“->”比“=>”更好。如果使用箭头而不是更常见的“#(){...}”模式,那么明显需要与“gte/lte”标记有所区别。而且,“因为其他人这样做”从来都不是一个好的论据,哈哈。
除了 Lieven 外,在该邮件列表中,我没有看到任何批评选择其他语言(如 Scala 或 Groovy)并没有这个问题,因为它们支持一些占位符语法。
实际上,你不会写“x => x.age <= 0;”,但这种写法很常见:“someList.partition(x => x.age <= 18)”我同意这看起来很糟糕。其他语言使用占位符语法使这一点更清晰,“someList.partition(_.age <= 18)”或“someList.partition(it.age <= 18)”。我希望你们能考虑类似的东西,这些小的闭包将被广泛使用!(我认为用“->”替换“=>”帮助不大)
->
并捍卫 =>
的人。当然,就像 Brian 预测的那样,双方几乎肯定都有意见,但最终在这些问题上必须做出选择,委员会根据所述原因做出了他们的选择。