Java中已经有很多封装代码块的接口,如ActionListener或者Comparator。lamdba表达式与这些接口是兼容的。
对于只有一个抽象方法的接口,需要这种接口的对象是,就可以提供一个lamdba表达式。这种接口称为函数式接口(functional interface)。
注释:你可能想知道为什么函数式接口必须有一个抽象方法。不是接口中的所有方法都是抽象的吗?实际上,接口完全有可能重新声明Object类的方法, 如 toString或clone,这些声明有可能会让方法不再是抽象的。(JavaAPI中的一些接口会重新声明Object方法来附加javadoc注释ComparatorAP丨就是这样一个例子。)更重要的是,在JavaSE8中,接口可以声明非抽象方法。
为了展示如何转换为函数式接口,下面考虑Arrays.sort方法。它的第二个参数需要一个Comparator实例,Comparator就是只有一个方法的接口,所以可以提供一个 lambda 表达式:
Arrays .sort (words ,
(first, second) -> first.lengthO - second.lengthO);
在底层,Arrays.sort方法会接收实现了Comparator 的某个类的对象。在这个对象上调用 compare 方法会执行这个lambda表达式的体。这些对象和类的管理完全取决于具体实现,与使用传统的内联类相比,这样可能要高效得多。最好把lambda表达式看作是一 个函数,而不是一个对象,另外要接受lambda表达式可以传递到函数式接口。
lamdba表达式可以转换为接口。
实际上,在Java中,对lambda表达式所能做的也只是能转换为函数式接口。在其他支持函数字面量的程序设计语言中,可以声明函数类型(如(String,String)-> int)、声明这些类型的变量,还可以使用变量保存函数表达式。不过,Java设计者还是决定保持我们熟悉的接 口概念,没有为Java语言增加函数类型。
注释:甚至不能把lambda表达式赋给类型为Object的变量,Object不是一个函数式接口。