2012-01-18 28 views
5

我已阅读http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html,并注意到所有示例都显式声明了参数类型,即使它已从接口函数声明中知道。Java 8 lambda语法中需要指定参数类型是否有任何原因?

public interface FileFilter { 
    /** ... **/ 
    boolean accept(File pathname); 
} 


FileFilter java = (File f) -> f.getName().endsWith(".java"); 

我们不能走只

(f) -> f.getName().endsWith(".java"); ? 

UPDATE:在JSR-335 Draft,我发现推断类型参数是最有可能得到支持

(int x) -> x+1 // Single declared-type parameter 
(int x) -> { return x+1; } // Single declared-type parameter 
(x) -> x+1 // Single inferred-type parameter 
x -> x+1 // Parens optional for single inferred-type case 
+1

,大部分的实施例中使用的清单参数类型的原因在省略的示例,即使从第1天开始考虑类型推断,也是纯粹的教学法。观众被认为是普通的Java开发人员,他们以前从未见过这些材料;抛出lambda表达式*和*一键式推断他们会有很大的吸引力。 – 2014-05-28 19:46:55

回答

3

有其中类型是“4.目标打字”部分

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2); 
0

我想这取决于它知道这种类型的时间有多迟。

在Java 7中,=右侧的代码不知道如何使用该表达式。只是为了编译需要对编译器进行设计更改。

从理论上说,你甚至不需要变量声明,因为它在父类中指定或可能是隐含的。

FileFilter java = (File f) -> f.getName().endsWith(".java"); 

可能是

FileFilter java = -> pathname.getName().endsWith(".java"); 

或有一个隐含的吸气剂。

FileFilter java = -> pathname.name.endsWith(".java"); 

或者您可以假设参数是隐式导入名称空间的,因为只有一个参数。 (像SQL不与列名)

FileFilter java = -> name.endsWith(".java"); 
相关问题