快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
表达式的返回值还是进行了类型推断。事实上,Java还推断了“异常类型”,这 点稍后会有更多讨论。

当然,Java中可以“无中生有”地定义“匿名函数类型”(这点和VB.NET相对更为接近),而不需要 像C#一样需要基于特定的“委托类型”,显得更为灵活。

SAM类型支持及闭包

SAM的全称是Single Abstract Method,如果一个类型为SAM类型,则意味着它 1) 是抽象类型(即接 口或抽象类),且 2) 只有一个未实现的方法。例如这样一个Java接口便是个SAM类型:

public interface Func<T, R> {    R invoke(T arg); }

于是我们便可以:

Func<int, int>[] array = new Func<int, int>[10]; for (int i = 0; i < array.length; i++) {    final int temp = i;    array[i] = #(int x)(x + temp); }

可见,我们使用Lambda表达式创建了Func接口的实例,这点是C#所不具备的。这点十分关键,因为在 Java类库中已经有相当多的代码使用了SAM类型。不过我发现,在某些使用SAM的方式下似乎会产生一些“ 歧义”,例如这段代码:

public class MyClass {    @Override    public int hashCode() {      throw new RuntimeException();    }    public void MyMethod() {      Func<int, int> func = #(int x)(x * hashCode());      int r = func.invoke(5); // throw or not?    } }

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

时间:2011-10-02 老赵

在这里我们覆盖(override)了MyClass的hashCode方法,使它抛出RuntimeException,那么在调用 MyMethod中定义的func1对象时会不会抛出异常?答案是否定的,因为在这个Lambda表达式中,隐藏的 “this引用”代表了func对象,调用它的hashCode不会抛出RuntimeException。那么,假如我们要调用 MyClass的hashCode怎么办?那就稍微有些麻烦了:

Func<int, int> func = #(int x)(x * MyClass.this.hashCode ());

不过从另一段示例代码上看:

public class MyClass {    public int n = 3;    public void MyMethod() {      Func<int, int> func = #(int x)(x + n);      int r = func.invoke(5); // 8    } }

由于Func对象上没有n,因此这里的n便是MyClass类里定义的n成员了。因此,Java的闭包并非不会捕 获字面上下文里的成员,只是在SAM类型的情况下,字面范围内(lexical scope)成员的优先级会低于目 标抽象类型的成员。

总体来说,对于SAM类型的支持上,我认为Java是有可取之处的,只是我始终认为这个做法会产生歧义 ,因为我印象中其他语言里的Lambda表达式似乎都是捕获字面上下文的(当然它们可能也没有SAM支持) 。但是,如何在“歧义”和“优雅”之间做出平衡,我一时也找不到令人满意的答案。

硬伤:Checked Exception

Java相当于其他常见语言有一个特别之处,那就是Checked Exception。Checked Exception意味着每 个方法要标明自己会抛出哪些异常类型(RuntimeException及其子类除外),这也是方法契约的一部分, 编译器会强制程序员写出满足异常契约的代码。例如某个类库中定义了这样一个方法:

public void myMethod() throws AException, BException

其中throws后面标注的便是myMethod可能会抛出的异常。于是如果我们要写一个方法去调用myMethod ,则可能是:

public void myMethodCaller() throws AException {    try {      myMethod();    } catch (BException ex) {      thro

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号