![](https://csdnimg.cn/release/download_crawler_static/88581190/bga.jpg)
法的接口,每一个该类型的 lambda 表达式都会被匹配到这个抽象方法。因为
默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
我们可以将 lambda 表达式当作任意只包含一个抽象方法的接口类型,确保你的
接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,
编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
示例如下:
代码如下:
@FunctionalInterface interface Converter<F, T> { T convert(F from); }
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123"); System.out.println(converted);
// 123
需要注意如果@FunctionalInterface 如果没有指定,上面的代码也是对的。
译者注 将 lambda 表达式映射到一个单方法的接口上,这种做法在 Java 8 之前
就有别的语言实现,比如 Rhino JavaScript 解释器,如果一个函数参数接收一个
单方法的接口而你传递的是一个 function,Rhino 解释器会自动做一个单接口的
实例到 function 的适配器,典型的应用场景有 org.w3c.dom.events.EventTarget
的 addEventListener 第二个参数 EventListener。
四、方法与构造函数引用
前一节中的代码还可以通过静态方法引用来表示:
代码如下:
Converter<String, Integer> converter = Integer::valueOf; Integer converted =
converter.convert("123"); System.out.println(converted); // 123
Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了
如何引用一个静态方法,我们也可以引用一个对象的方法:
代码如下:
converter = something::startsWith; String converted =
converter.convert("Java"); System.out.println(converted); // "J"
接下来看看构造函数是如何使用::关键字来引用的,首先我们定义一个包含多个
构造函数的简单类: