Java 8 lambda语法中需要指定参数类型有什么原因吗?

Java 8 lambda语法中需要指定参数类型有什么原因吗?,java,lambda,java-8,Java,Lambda,Java 8,我已经阅读并注意到,所有示例都显式声明了参数类型,尽管从接口函数声明中已经知道了参数类型 public interface FileFilter { /** ... **/ boolean accept(File pathname); } FileFilter java = (File f) -> f.getName().endsWith(".java"); 我们不能就这么走吗 (f) -> f.getName().endsWith(".java"); ? 更

我已经阅读并注意到,所有示例都显式声明了参数类型,尽管从接口函数声明中已经知道了参数类型

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


FileFilter java = (File f) -> f.getName().endsWith(".java");
我们不能就这么走吗

(f) -> f.getName().endsWith(".java"); ?
更新:在中,我发现推断类型参数最有可能得到支持

(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 

我想这取决于它知道类型有多晚

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

理论上,您甚至不需要变量声明,因为它是在父级中指定的,或者可能是隐含的

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

FileFilter java = -> pathname.getName().endsWith(".java");
或者用一个隐含的getter

FileFilter java = -> pathname.name.endsWith(".java");
或者,您可以假定参数是隐式导入到名称空间的,因为只有一个参数。(就像SQL对列名所做的那样)


有一个例子,在“4.目标类型”部分中省略了类型

comparatorc=(s1,s2)->s1.compareTignoreCase(s2);

大多数示例使用清单参数类型的原因(即使从第1天开始考虑类型推断)纯粹是教学上的。观众被认为是普通的Java开发人员,他们以前没有看过任何此类材料;一次就把lambdas和类型推断扔给他们会有很多好处。
FileFilter java = -> name.endsWith(".java");
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);