2014-03-31 68 views
2

我正在研究JDK 8個API和內部Function接口,我注意到標識功能關於lambda語法

static <T> Function<T, T> identity() { 
    return t -> t; 
} 

這解決的方法:

R apply(T t); 
在同一 Function接口中聲明

問題是爲什麼t -> t部分工作。

如果我們熟悉匿名內部類的條款擴大這種表達

new Function<String, String>() { 

    @Override 
    String apply(String t) { 
     t; // Oops, compilation error 
    } 
} 

t -> tt -> { return t; }捷徑?

+5

這只是lambda語法的一部分,是的,'t - > t'只是't - > {return t; }'。 – Jesper

回答

5

問題是爲什麼t -> t部分工作。

因爲lambda表達式可以返回它作爲參數所需的值。 return隱含在lambda表達式的目標類型的右側部分。表達基本上是一樣的:

t -> { return t; } 

這意味着,t -> t將失敗與方法的功能的界面,具有void返回類型,如在下面的情況:

Consumer<String> consumer = t -> t; 

目標類型拉姆達的有是Consumer<T>,其中有方法 - void accept(T t)。由於該方法具有void返回類型,因此上述分配失敗。

您可以通過State of the Lambda瞭解更多信息。