2.4 函数接口

2.4 函数接口 - 图1函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型。

在Java里,所有方法参数都有固定的类型。假设将数字3作为参数传给一个方法,则参数的类型是int。那么,Lambda表达式的类型又是什么呢?

使用只有一个方法的接口来表示某特定方法并反复使用,是很早就有的习惯。使用Swing编写过用户界面的人对这种方式都不陌生,例2-2中的用法也是如此。这里无需再标新立异,Lambda表达式也使用同样的技巧,并将这种接口称为函数接口。例2-8展示了前面例子中所用的函数接口。

例2-8 ActionListener接口:接受ActionEvent类型的参数,返回空

  1. public interface ActionListener extends EventListener {
  2. public void actionPerformed(ActionEvent event);
  3. }

ActionListener只有一个抽象方法:actionPerformed,被用来表示行为:接受一个参数,返回空。记住,由于actionPerformed定义在一个接口里,因此abstract关键字不是必需的。该接口也继承自一个不具有任何方法的父接口:EventListener

这就是函数接口,接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可。可在函数接口中为参数起一个有意义的名字,增加代码易读性,便于更透彻地理解参数的用途。

这里的函数接口接受一个ActionEvent类型的参数,返回空(void),但函数接口还可有其他形式。例如,函数接口可以接受两个参数,并返回一个值, 还可以使用泛型,这完全取决于你要干什么。

以后我将使用图形来表示不同类型的函数接口。指向函数接口的箭头表示参数,如果箭头从函数接口射出,则表示方法的返回类型。ActionListener的函数接口如图2-1所示。

2.4 函数接口 - 图2

图2-1:ActionListener接口,接受一个ActionEvent对象,返回空

使用Java编程,总会遇到很多函数接口,但Java开发工具包(JDK)提供的一组核心函数接口会频繁出现。表2-1罗列了一些最重要的函数接口。

表2-1:Java中重要的函数接口

接口 参数 返回类型 示例
Predicate T boolean 这张唱片已经发行了吗
Consumer T void 输出一个值
Function T R 获得Artist对象的名字
Supplier None T 工厂方法
UnaryOperator T T 逻辑非 (!)
BinaryOperator (T, T) T 求两个数的乘积 (*)

前面已讲过函数接口接收的类型,也讲过javac可以根据上下文自动推断出参数的类型,且用户也可以手动声明参数类型,但何时需要手动声明呢?下面将对类型推断作详尽说明。