什么是函数式接口(Functional Interface)
其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。
函数式接口用途
它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
关于@FunctionalInterface注解
Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
正确例子,没有报错:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。
aaarticlea/png;base64,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" alt="" />
提醒:加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法
函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message); default void doSomeMoreWork1()
{
// Method body
} default void doSomeMoreWork2()
{
// Method body
}
}
函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
static void printHello(){
System.out.println("Hello");
}
}
函数式接口里允许定义java.lang.Object里的public方法
函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message); @Override
boolean equals(Object obj);
}
JDK中的函数式接口举例
java.lang.Runnable,
java.awt.event.ActionListener,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等
参考资料
http://howtodoinjava.com/java-8/functional-interface-tutorial/