为什么在Java 8 lambda语法中需要指定参数类型是否有任何理由?

时间:2012-01-18 09:01:35

标签: java lambda java-8

我已阅读http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html并注意到所有示例都具有显式声明的参数类型,即使它已经从interface-function声明中已知。

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


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

我们不能只用

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

更新:在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 

2 个答案:

答案 0 :(得分:3)

有一个例子,在“4.目​​标打字”部分

中省略了该类型
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);

答案 1 :(得分: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");