Java Lambda类型推断
lambda表达式表示函数接口的实例。
根据上下文,一个lambda表达式可以映射到不同的函数接口类型。
编译器推断lambda表达式的类型。
例子
在下面的代码中有两个函数接口, Processor
和SecondProcessor
。
Processor
有一个名为 getStringLength
的方法,它接受一个字符串作为参数,并返回 int
。
SecondProcessor
有一个名为 noName
的方法,它接受一个字符串作为参数,并返回一个 int
。
从代码中,我们可以看到,我们可以为它们分配两个相同的lambda表达式。
public class Main { public static void main(String[] argv) { Processor stringProcessor = (String str) -> str.length(); SecondProcessor secondProcessor = (String str) -> str.length(); //stringProcessor = secondProcessor; //compile error String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length); } } @FunctionalInterface interface Processor { int getStringLength(String str); } @FunctionalInterface interface SecondProcessor { int noName(String str); }
上面的代码生成以下结果。
注意
Processor
或 SecondProcessor
称为目标类型。
推断lambda表达式类型的过程称为目标类型。
编译器使用以下规则来确定lambda表达式是否可分配给其目标类型:
- 它必须是一个函数接口。
- lambda表达式的参数必须与函数接口中的抽象方法匹配。
- lambda表达式的返回类型与函数接口中抽象方法的返回类型兼容。
- 从lambda表达式抛出的检查异常必须与函数接口中抽象方法的已声明的throws子句兼容。