Java Lambda从入门到精通五 类型检查和类型判断

本节我们来简单说一下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的书写。