函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口。
一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依然会把它看做函数式接口。
如下是函数式接口的实例:
public interface A { String sayHi(); } interface B { void sayHey(); } interface C { default void helloWorld() { System.out.println("HelloWorld"); } void sayHello(); } interface D { default void helloWorld() { System.out.println("HelloWorld"); } default String helloWorld2() { return "HelloWorld"; } void sayNothing(); } @FunctionalInterface interface E { void handle(int i); //此处的boolean equals(Object obj);方法不是抽象方法,因为相同的方法已在java.lang.Object 实现 //任何被java.lang.Object实现的方法,都不能视为抽象方法 boolean equals(Object obj); }
Lambda表达式用在函数式接口出现的地方:
Lamda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,
并把整个表达式作为函数式接口的实例(具体来说,是函数函数式接口一个具体实现的实例。)
如下是Lambda 为Runnable 函数式接口的抽象方法run 提供实现的例子:
/** * Lamda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现, * 并把整个表达式作为函数式接口的实例(具体来说,是函数函数式接口一个具体实现的实例。) * * 如下所示,使用lambda表达式可以简化匿名类的编写。 * * * Runnable 是一个函数式接口 * @FunctionalInterface * public interface Runnable { * public abstract void run(); * } * */ public class LambdaDemo { public static void main(String[] args) { // 使用Lambda Runnable r1 = () -> System.out.println("Hello World 1"); // 使用匿名类 Runnable r2 = new Runnable() { @Override public void run() { System.out.println("Hello World 2"); } }; process(r1); process(r2); process(() -> System.out.println("Hello World 3")); } public static void process(Runnable r) { r.run(); } }