InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

Java决定使用C#及Scala的Lambda语法

作者 Alex Blewitt 译者 赵劼 发布于 2011年9月10日

领域
语言 & 开发
主题
C# ,
Java ,
语言 ,
.NET ,
语言设计 ,
编程

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 => x + 1
(x) => x + 1
(int x) => x + 1
(int x, int y) => x + y
(x, y) => x + y
(x, y) => { System.out.printf("%d + %d = %d%n", x, y, x+y); }
() => { System.out.println("I am a Runnable"); }

Lambda表达式的关键优势,在于它们会对参数进行类型推断。不过在某些情况下,编译器依然无法推断出正确类型(尤其是出现操作符重载的时候,例如:(x, y) => x + y 在Java编译器不知道x和y是int还是double时候)。一般来说,类型推断引擎都能自动得出正确的代码,如果需要更多提示,程序员也始终可以显示地增加类型信息。

不久的将来会发布支持新语法的编译器以供体验。

译者 赵劼 网名为老赵,洋名Jeffrey Zhao,写有技术博客“老赵点滴”。关注前沿技术,并致力于开源社区与微软平台的组合优化。

Java终于做出了一个明智的选择 发表人 Zhao Jeffrey 发表于
Re: Java终于做出了一个明智的选择 发表人 Jia Jerome 发表于
well done! Lao Zhao 发表人 zz fff 发表于
Java 过于注重体系。。。 发表人 李 记忆 发表于
Re: Java 过于注重体系。。。 发表人 Zhao Jeffrey 发表于
对于C#我现在就一个愿望 发表人 Shichao Liu 发表于
Lambda蛮好用的 发表人 lu jin 发表于
搞这个有什么意义?` 发表人 fei yin 发表于
Re: 搞这个有什么意义?` 发表人 Zhao Jeffrey 发表于
  1. 返回顶部

    Java终于做出了一个明智的选择

    发表人 Zhao Jeffrey

    之前的那些草案都太丑了,很奇怪为什么他们要搞那么多奇怪的符号,语义都施展不开,还是C#和Scala这种好。

  2. 返回顶部

    well done! Lao Zhao

    发表人 zz fff

    我敢肯定没人回复,.net的粉丝都很谦卑;java的拥趸只能生闷气。

  3. 返回顶部

    Java 过于注重体系。。。

    发表人 李 记忆

    Java 7 好像就有那种“古怪”的表达式了。。。呵呵~

  4. 返回顶部

    对于C#我现在就一个愿望

    发表人 Shichao Liu

    提供一种编译时获取类型成员信息的能力, 类似typeof(C), 搞些fieldof(C._myInt)这种东西. 函数重载和重写确实是个小障碍,但不是那么不可解决嘛.

  5. 返回顶部

    Lambda蛮好用的

    发表人 lu jin

    感觉Java一板一式的太规范了。

  6. 返回顶部

    Re: Java 过于注重体系。。。

    发表人 Zhao Jeffrey

    Java 7哪有这种东西啊……或者本来想有,后来推到Java 8了。

  7. 返回顶部

    搞这个有什么意义?`

    发表人 fei yin

    实际作用是什么?

  8. 返回顶部

    Re: 搞这个有什么意义?`

    发表人 Zhao Jeffrey

    网上文章一搜一大把,基本这是现代编程语言的必备特性之一了,可见Java之前原理现代编程语言群体有多远了……

  9. 返回顶部

    Re: Java终于做出了一个明智的选择

    发表人 Jia Jerome

    这个赞同,以前的基本看下sample就恶心了,一点都没有想深入研究的想法。其他语言里相对容易接受的一些做法他们非不要,搞些奇奇怪怪的符号…