@FunctionalInterface注解

@FunctionalInterface(函数式接口)

自JDK 1.8后许多接口都添加了@FunctionalInterface注解,作用到接口上表明这个接口为函数式接口

例如下面的一些接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener

例如:Runnable接口的源码中添加了@FunctionalInterface注解

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

查看源码中的JavaDoc可以知道这个注解有以下特点:

1、该注解只能标记在"有且仅有一个抽象方法"的接口上。

2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。

3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。

4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

// @FunctionalInterface注解的源码
package java.lang;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

通过了解@FunctionalInterface注解的特点后,我们可以自定义一个接口,并使这个注解作用到我们创建的这个接口

@FunctionalInterface
interface MyInterface{
    void MyMethod();
}

那么我们现在就可以使用 Lambda 表达式来表示该接口的一个实现:(JDK 1.8支持使用Lambda表达式,JDK 1.8之前只能用匿名内部类方式实现)

public static void main(String[] args) {
    MyInterface mif = ()->{
        System.out.println("使用Lambda表达式");
    };
    mif.MyMethod();//使用Lambda表达式
}
posted @ 2020-12-01 17:18  艾莉的冷笑话  阅读(933)  评论(0编辑  收藏  举报