函数式接口和Lambda表达式

函数式接口(一般标有@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();
    }

}
原文地址:https://www.cnblogs.com/luffystory/p/11969683.html