5

我已阅读http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html并注意到所有示例都明确声明了参数类型,即使它已经从接口函数声明中知道.

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 
4

2 回答 2

3

在“4.目​​标类型”部分有一个类型被省略的例子

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
于 2012-01-18T10:32:35.327 回答
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");
于 2012-01-18T09:17:58.830 回答