函数式接口就是只包含一个抽象方法的接口。可以这样声明:
@FunctionalInterface
interface MultiplyNumbers {
void multiply(int x, int y);
}
说明:
@FunctionalInterface用于标记这是函数式接口,编译器会检查是否只有一个抽象方法。multiply是抽象方法,接收两个int参数。void表示该方法不返回值。
之后可以用 Lambda 实现它:
MultiplyNumbers obj = (x, y) -> System.out.println(x * y);
注意接口名称要完整写成 MultiplyNumbers,不要截断;方法参数和类型也要与一致。
eg:
java
import java.util.Scanner;
@FunctionalInterface
interface MultiplyNumbers {
void multiply(int x,int y);
}
class Main {
public static void main(String[] args) {
// implement the functional interface using lambda expressions
MultiplyNumbers obj = (x, y) -> {
System.out.println(x * y);
};
Scanner input = new Scanner(System.in);
int input1 = input.nextInt();
int input2 = input.nextInt();
obj.multiply(input1, input2);
}
}
Q&A
Q:obj是接口名吗?
A:不是。这里:
MultiplyNumbers obj = (x, y) -> {
System.out.println(x * y);
};
MultiplyNumbers是接口类型obj是一个变量名,表示该接口类型的对象引用(x, y) -> {...}是 Lambda 表达式,用来实现接口中的multiply(int x, int y)方法
可以理解为:
MultiplyNumbers obj;
obj = (x, y) -> System.out.println(x * y);
之后通过 obj 调用接口方法:
obj.multiply(input1, input2);
因为 MultiplyNumbers 是函数式接口,所以可以直接用 Lambda 创建它的实现。