Java 8里最重要的更新之一便是引入了Lambda语法,这样可以将匿名函数作为参数或变量。然而,这方面的语法始终未能确定下来,也曾经有过投票,咨询社区更适应哪种语法。
\\最近,lambda-dev在邮件列表宣布,Java的Lambda语法决定基于C#语法。这种语法在C#语言里已经使用很长时间了(C#在1.0时期便引入了委托类型,并在2.0里支持匿名函数,3.0对Lambda表达式提供支持)。
\\从调查结果来看,其他一些语法选择(例如BGGA)相对别的设计并没有表现出明显的优势。而在C#和Scala中已经长时间使用的语法体验,意味着会有大量程序员已经熟悉此类语法了(C#和Scala的主要区别,在于匿名函数的参数如何标识其类型:C#使用“int foo”,而Scala使用“foo: int”——人们很容易适应这种细微区别。Java会使用C#的形式“int foo”,因为这已经是Java语言的表示方法了)。
\\\\\我们进行了很广泛的探索,但是最终发现没有哪种选择是明显的赢家(每种形式都有好的方面和不那么好的方面,也没有哪种形式明显好过其他的)。因此,与重新发明一种新的语法相比,我们认为还是选择一种在两种和Java比较相似的语言里——C#和Scala——已经得到证明的语法比较合适。
\
这种语法同时支持表达式和代码块。表示式的形式不需要大括号,并且在执行后返回结果。语法块的形式需要使用大括号,除非使用了return关键字,否则不会直接返回结果。邮件里也给出了示例:
\\x =\u0026gt; x + 1\(x) =\u0026gt; x + 1\(int x) =\u0026gt; x + 1\(int x, int y) =\u0026gt; x + y\(x, y) =\u0026gt; x + y\(x, y) =\u0026gt; { System.out.printf(\"%d + %d = %d%n\