浅谈Java 7的闭包与Lambda表达式之优劣
2010-06-15 00:00:00 来源:WEB开发网第二种,即多条语句:
// 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还推断了“异常类型”,这点稍后会有更多讨论。
更多精彩
赞助商链接