本节我们来简单说一下lambda的类型检查和类型判断。
类型检查
lambda的类型检查,我们在第二节其实已经重点说过了。
我们所写的任何lambda表达式,都要有对应的函数式接口的抽象方法与之对应。也就是说lambda的入参和返回值,要和函数式接口的抽象方法定义的入参和返回值相匹配。只有有对应的函数式接口抽象方法,才能使用对应的lambda表达式。
前面的例子:
printApple(apples,(Apple a) -> a.getColor().equals("红") ? "红苹果" : "绿苹果");
当程序编译,遇到方法的第二个参数lambda表达式:
(Apple a) -> a.getColor().equals(“红”) ? “红苹果” : “绿苹果”)
编译器解析后,上面的表达式需要这样一个抽象接口 String accept(Apple appple),我们在代码中已经声明过这样的函数式接口对应的方法了:
@FunctionalInterface
public interface AppleFormatter {
String accept(Apple apple) throws ClassCastException;
}
如果找不到,那么在编译代码时则会报错。
类型判断
lambda表达式能够推断出表达式需要的抽象接口,也就是能找到lambda对应的签名,所以,其参数类型和返回类型,都是可以知道的,知道了入参,那么我们写的lambda还能进行简化。
上面的lambda是这样写的:
(Apple a) -> a.getColor().equals("红") ? "红苹果" : "绿苹果");
既然lambda能自己知道参数类型,那么我们可以省略,写成这样:
a -> a.getColor().equals("红") ? "红苹果" : "绿苹果");
上面参数的Apple类型声明省略了。
上面这种简化,也只是有限度的简化,后面我们会学习lambda的方法引用,方法引用能够进一步简化lambda的书写。