快速业务通道

浅谈Java 7的闭包与Lambda表达式之优劣 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

浅谈Java 7的闭包与Lambda表达式之优劣

时间:2011-10-02 老赵

前几天Oracle推出了Java 7官方的闭包与Lambda表达式的第一个实现,这基本上也是最终在正式版中 的样式了。看了这个实现之后,我的第一感觉便是“丑”,当然不排除这是因为看惯了其他语言中实现的 缘故。后来再仔细看了看又想了想,发现Java 7的实现也并非毫无可取之处,但似乎又感到某些做法上有 一些问题。总之整个过程颇为有趣,决定将我的想法记录下来,希望可以吸引人来一起讨论一下。

Java 7中的Lambda表达式

Java 7中的Lambda表达式有两种形式,首先是第一种:

#int() func1 = #()(3); // "func1.()" returns 3 #int(int) func2 = #(int x)(x + 1); // "func2.(3)" returns 4 #int(int, int) func3 = #(int x, int y)(x - y); // "func3.(5, 3)" returns  2

然后是第二种,含义与上面等价:

#int() func1 = #(){ return 3; }; #int(int) func2 = #(int x){ return x + 1; }; #int(int, int) func3 = #(int x, int y){ return x – y; };

如果Lambda的body是“单个表达式”的话,便可以使用“小括号”,并省去最后的return关键字;如 果body中需要包含多条语句的话,则必须使用“大括号”,而大括号内部可以包含多条语句,就像一个普 通的方法体一样。这两种写法在C#中也有对应物,如在“单个表达式”的情况下:

// C# Func<int> func1 = () => 3; // "func1()" returns 3 Func<int, int> func2 = x => x + 1; // "func2(3)" returns 4 Func<int, int, int> func3 = (x, y) => x - y; // "func3(5, 3)"  returns 2

第二种,即多条语句:

// C# Func<int> func1 = () => { return 3; }; Func<int, int> func2 = x => { return x + 1; }; Func<int, int, int> func3 = (x, y) => { return x – y; };

Java和C#的Lambda表达式都由两部分组成:“参数列表”和“表达式体”,但是它们有如下区别:

在Java中参数列表和表达式体之间没有分隔符号,而C#使用“=>”分隔。

对于“单个表达式”的Lambda来说,C#可以无需使用括号包含表达式体,而Java必须使用小括号。

如果只有单个参数,那么C#的参数列表可以省去小括号,而Java必须保留。

C#对参数列表会进行“类型推断”,而Java必须写清参数类型。

浅谈Java 7的闭包与Lambda表达式之优劣(2)

时间:2011-10-02 老赵

这些区别说大可大,说小可小,但是Java语言的设计的确让我感觉较C#为“丑”,这可能是个人主观 因素,但我认为也不尽然。例如,如果我们需要对一个用户对象数组按照“年龄”进行排序,在C#里可以 写作:

// C# users.Sort(u => u.Age);

而在Java中则必须写为:

Arrays.sort(users, #(User u)(u.Age));

这句C#代码语义清晰:按照“u的Age进行排序”,而在Java代码中便显得比较累赘,语义似乎也不够 清晰。Anders在设计C#语法的时候非常注重“声明式”代码,由此可见一斑。此外,我不明白为什么Java 选择不对参数进行类型推断,在我看来这对于写出优雅代码十分重要(关于这点,在“Why Java Sucks and C# Rocks”系列中会有更详细的讨论)。不过Java也不是没有“推断”,例如从上面的代码片断中可 以得知,Java对于Lambda

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号