InfoQ

InfoQ

新闻

我的书签

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

该内容已经被标记书签!

标记书签错误,请重试!

Java Lambda语法的首个版本引发众多争论

作者 Dionysios G. Synodinos 译者 张龙 发布于 2010年6月22日

领域
语言 & 开发
主题
Java ,
语言 ,
编程 ,
闭包(Closures)

近日,Oracle的Maurizio Cimadamore在OpenJDK Mercurial仓库发布了初始的lambda实现这让我们有机会首次目睹该新语法的容貌,同时也引发了社区的广泛争论。

目前的原型支持如下特性:

下面的代码片段声明了一个简单的lambda表达式,该表达式接收一个整型,加一后返回:

int i1 = #()(3).();
assertTrue(3 == i1);
Integer i2 = #()(3).();
assertTrue(3 == i2);
int i3 = #(int x)( x + 1 ).(3);
assertTrue(4 == i3);
int i4 = #(Number x)(x.intValue()).(new Float(3.0f));
assertTrue(3 == i4);
Object o = #()(3);
assertTrue(o != null); 

该原型支持规范草案所描述的语法,如果想要更好地了解语法,读者可以看看衰退 测试

因为Java通常使用长单词而非符号,因此有很多人觉得这种语法太笨拙,并不符合语言本身的感官。

来自Ajaxian的Dion Almaer认为这种语法更接近于Perl而非Java

Integer i2 = #()(3).(); //i2 = 3
int i4 = #(Number x)(x.intValue()).(new Float(3.0f)); //i4 = 3 Erm, Java? Or Perl!!

无独有偶,Ruby on Rails的创始人David Heinemeier Hansson认为这种语法太乱

Java 7新的闭包语法:int i4 = #(Number x)(x.intValue()).(new Float(3.0f));——这一行也太长了吧!

不少Java开发者在论坛和讨论组上抨击这种lambda语法:

Java Posse Group

“吼吼,这也太恶心了吧。源代码乱的一团糟”。

“恩,这种恶心的语法倒是能够减轻编译器开发者的工作量。一定还有更好的方案能够解决这个问题。即便是Obj-C的块都比这强(至少语法比这强)”。

”为了保证向后兼容,Java没法实现更优雅的解决方案,但现在这其实根本不算什么问题“。

Baptiste Wicht的博文

”一看到int i1 = #()(3).();这一行我就无语了,第一眼还以为代码写错了呢“。

”肯定还有改进的空间。如果用adder(1, 2)代替adder.(1, 2),我觉得会好很多,把点放在中间并不符合Java风格“。

Hacker News

“这种语法太丑陋了”。

“从实践上来说,Java并不会使用过多的符号。他们这帮人为什么要这么做呢?我并不是说反对他们(相对于长单词来说,我也更偏爱符号,虽说这会导致更长的学习曲线),但这与Java规范格格不入”。

另一方面,Nick Wiedenbrueck认为该提案由来已久,Java社区应该认识到将要发生什么

现在有几个提案,上次的Devoxx大会上也宣布了提案草案与规范草案,但社区并没有对此进行过充分的讨论。什么原因呢?我有一些假设。lambda项目太安静了么?根本就没有几篇博文或是示例介绍lambda。社区出什么问题了么?社区领域跑哪儿去了?难道都忙着学Scala去了?静态类型语言(没有类型推断)中的闭包就应该这么复杂么?

最后,该原型的创建者之一的Brian Goetz说到,在进入到产品阶段前还会继续改进语法

记住,这只是早期的概念验证阶段。这里面的语法都是暂时的,随着Lambda项目的不断发展,语法也会发生很大的变化。同时,还有很多比语法重要的东西,我们的全部精力都放在这上面了——语法要为之让路。

InfoQ上有篇深度探索面向Java语言的Lambda的文章,感兴趣的读者不妨移步一观(文章包含了为何当前的语法是adder.(1, 2)而不是adder(1, 2))。

社区观点:InfoQ中文站.NET社区编辑赵劼针对Java Lambda表达式专门发表了一篇题为《浅谈Java 7的闭包与Lambda表达式之优劣》的博文,深入浅出地探讨了Java Lambda表达式的使用方式及其缺陷,博文以大量的实例阐述了目前Java Lambda表达式的种种硬伤,读者可以从中了解到当前Java Lambda表达式的现状。此外,该文的评论也很丰富,包含了很多有意义的信息,会对读者起到一定的帮助作用。

查看英文原文:First Version of Java Lambda Syntax Sparks Debate

译者 张龙 热衷于编程,乐于分享,对新技术有强烈的探索欲,对Java轻量级框架有一定研究。

简直就跟狗屎一样 发表人 ran Dig 发表于
Re: 简直就跟狗屎一样 发表人 jin chen 发表于
Re: 简直就跟狗屎一样 发表人 冯 兰池 发表于
Re: 简直就跟狗屎一样 发表人 Fan Cary 发表于
Re: 简直就跟狗屎一样 发表人 gao yu 发表于
Re: 简直就跟狗屎一样 发表人 ran Dig 发表于
Re: 简直就跟狗屎一样 发表人 Liu Nathan 发表于
Re: 简直就跟狗屎一样 发表人 Wang Xuesong 发表于
Re: 简直就跟狗屎一样 发表人 Liu Nathan 发表于
Re: 简直就跟狗屎一样 发表人 Zhang Shawn 发表于
"把点放在中间并不符合Java风格"... 发表人 Cswords Barry 发表于
怪异 发表人 chen index 发表于
C#SAM 发表人 Shichao Liu 发表于
Java Lambda 发表人 huang wenjun 发表于
其实用中括号就行 发表人 Guo Lamu 发表于
这到底是TMD的哪门子语法。 发表人 Ma Karl 发表于
Re: 这到底是TMD的哪门子语法。 发表人 Jakuri Gavin 发表于
  1. 返回顶部

    简直就跟狗屎一样

    发表人 ran Dig

    c# ruby scala 无论哪一个都比它好,比当年的二等残废-泛型还要恶心,java是该滚出舞台,编程历史了

  2. 返回顶部

    "把点放在中间并不符合Java风格"...

    发表人 Cswords Barry

    真的

  3. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 jin chen

    语法好丑,这样的语法又如何保证阅读效率???

  4. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 冯 兰池

    可是它的开源社区和那些库 框架真的很棒 我们吃饭的家什又不只靠语言

  5. 返回顶部

    怪异

    发表人 chen index

    用#号标识函数很奇怪,为何不用{}

  6. 返回顶部

    C#SAM

    发表人 Shichao Liu

    class MySam : ISomeInterface{
    Func<P,R> _h;
    public MySam(Func<P,R> h){ _h = h; }
    public R SomeInterfaceMethod(P p){ return _h(p); }
    }</p,r></p,r>

  7. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 Fan Cary

    争论这些毫无意义。
    我还是更加关注其有多大实用价值。

  8. 返回顶部

    Java Lambda

    发表人 huang wenjun

    参考C#的语法就很好了,最好再加入类似LINQ的语法功能

  9. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 gao yu

    哥们,新手吧?稍懂点的都清楚语言本身无优劣之分

  10. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 ran Dig

    哥们,真高手啊,语言要无优劣之分,您怎么不用汇编写web应用

  11. 返回顶部

    其实用中括号就行

    发表人 Guo Lamu

    为什么非要引入#来代替\lambda呢?

    比如:
    int i1 = [ : 3]();
    Integer i2 = [ : 3]();
    int i3 = [x:x+1](3);
    int i4 = [Number x : x.intValue()](new Float(3.0f));
    Object o = [ : 3];

  12. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 Liu Nathan

    哥们,真高手啊,语言要无优劣之分,您怎么不用汇编写web应用
    语言无优劣之分,但有自己适用的场景

  13. 返回顶部

    这到底是TMD的哪门子语法。

    发表人 Ma Karl

    RT

  14. 返回顶部

    Re: 这到底是TMD的哪门子语法。

    发表人 Jakuri Gavin

    是啊,把Java搞的越来越差了

  15. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 Wang Xuesong

    你这就是变相承认在每一个场景下都有优劣之分……

  16. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 Liu Nathan

    那是当然,总不能用汇编来做网游吧

  17. 返回顶部

    Re: 简直就跟狗屎一样

    发表人 Zhang Shawn

    哥们,真高手啊,语言要无优劣之分,您怎么不用汇编写web应用


    这位仁兄显然不知道汇编是很NB的语言。之所以不用汇编写web应用不是它不好,更不是不能用它写,而是不适合。比如你为什么不自己用棉花纺线织布做衣服再串,你用来开发web应用的程序(或者框架、技术……)也是由很多基础的东西一步一步构建起来的。最简单而言,没有汇编,就没有我们现在使用的OS,更何谈web应用。

    话说回来,上边提到的语法确实让人很痛苦,总觉得像加了密的,呵呵。