@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表达式
}