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

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

 2010-06-15 00:00:00 来源:WEB开发网   
核心提示: Func<int,int>func=#(intx)(x*MyClass.this.hashCode());不过从另一段示例代码上看:publicclassMyClass{publicintn=3;publicvoidMyMethod(){Func<int,int>func

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) { 
    throw new AException(ex); 
  } 
}

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

Tags:Java 闭包 Lambda

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