JDK8学习笔记(二)深识lambda表达式

本篇文章再介绍一些其他关于lambda表达式的其他概念和细节,比如函数描述符,方法引用、lambda表达式是如何类型检查的?lambda表达式类型推断,复合lambda表达式的写法。

1、函数描述符

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符。例如,Runnable接口可以看作一个什么也不接受什么也不返回(void)的函数的签名,因为它只有一个叫作run的抽象方法,这个方法什么也不接受,什么也不返回(void)。

函数描述符也叫lambda表达式签名

这个Runnable接口的函数描述符就是:()-> void 。还有其他的函数式接口的描述符如下:

Predicate<T> T->boolean

Consumer<T> T->void Function<T,R> T->R

2、lambda表达式的类型检查、类型推断

类型检查过程可以分解为如下所示: 首先,你要找出filter方法的声明。 第二,要求它是Predicate<Apple>(目标类型)对象的第二个正式参数。 第三,Predicate<Apple>是一个函数式接口,定义了一个叫作test的抽象方法。 第四,test方法描述了一个函数描述符,它可以接受一个Apple,并返回一个boolean。 最后,filter的任何实际参数都必须匹配这个要求。 这段代码是有效的,因为我们所传递的Lambda表达式也同样接受Apple为参数,并返回一个boolean。请注意,如果Lambda表达式抛出一个异常,那么抽象方法所声明的throws语句也必须与之匹配。

同一个Lambda表达式就可以与不同的函数式接口联系起来,只要它们的抽象方法签名能够兼容。比如,前面提到的Callable和PrivilegedAction,这两个接口都代表着什么也不接受且返回一个泛型T的函数。

特殊void兼容规则的例子:

// Predicate返回了一个boolean Predicate<String> p = s -> list.add(s); // Consumer返回了一个void Consumer<String> b = s -> list.add(s);

3、方法引用

经验分享 程序员 微信小程序 职场和发展