WEB开发网
开发学院软件开发Java 浅谈Java 7的闭包与Lambda表达式之优劣 阅读

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

 2010-06-15 00:00:00 来源:WEB开发网   
核心提示: 第二种,即多条语句://C#Func<int>func1=()=>{return3;};Func<int,int>func2=x=>{returnx+1;};Func<int,int,int>func3=(x,y)=>{returnx&nda

第二种,即多条语句:

// 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语言的设计的确让我感觉较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表达式的返回值还是进行了类型推断。事实上,Java还推断了“异常类型”,这点稍后会有更多讨论。

上一页  1 2 3 4 5 6  下一页

Tags:Java 闭包 Lambda

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接