【有书共读】Java攻略 读书笔记05
函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。
@FunctionalInterface
public interface PalindromeChecker {
boolean isPalidrome(String s);
} 由于PalindromeChecker仅包含一个抽象方法,属于函数式接口。
@FunctionalInterface并非必需,但是基于以下两个原因,所以一般都要写上
-
@FunctionalInterface会触发编译时校验,有助于检查确保接口符合要,如果接口不包含或包含多个抽象方法,程序将提示编译错误
-
其次,添加@FunctionalInterface注解后,会在javadoc中生成以下语句:
Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
函数式接口中同样可以使用default和static方法。
-
函数式接口里允许定义默认方法:因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
-
函数式接口里是可以包含静态方法:因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
-
函数式接口里允许定义 java.lang.Object 里的 public 方法:这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;
@FunctionalInterface
public interface MyInterface {
//单一抽象方法
int myMethod();
//int myOtherMethod();
//如果这句未被注释掉,MyInterface将不再是函数式接口
//函数式接口里允许定义默认方法
default String sayHello() {
return "Hello world!";
};
//函数式接口里是可以包含静态方法
static void myStaticMethod() {
System.out.println("I'm a static method in an interface");
}
@Override
//函数式接口里允许定义 java.lang.Object 里的 public 方法
//equals方法来自object类,因此已有一个默认的实现
boolean equals(Object obj);
} public interface MyChildInterface extends MyInterface {
int anotherMethod();//其他抽象方法
} MyChildInterface不属于函数式接口,因为它包含了两个抽象方法,继承自MyInterface的myMetho和声明的anothoerMethod。即便没有添加@FunctionalInterface注解,代码也可以编译,因为MyChildInterface就是一个标准接口,但无法作为lambda表达式的目标。