函数式接口就是为Java 8
的Lambda
表达式准备的,Java 8
允许使用Lambda
表达式创建函数式接口的实例,因此Java 8
专门增加了@FunctionalInterface
。
什么是函数式接口
我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。
FunctionalInterface作用
@FunctionalInterface
就是用来指定某个接口必须是函数式接口,所以@FunInterface
只能修饰接口,不能修饰其它程序元素。
看下一下面的方法
@FunctionalInterface
public interface BufferedReaderProcessor {
/**
* 静态方法
*/
static void process() {
System.out.println("process");
}
/**
* 抽象方法
*
* @param bufferedReader
* @return
* @throws IOException
*/
String process(BufferedReader bufferedReader) throws IOException;
/**
* 默认方法
*
* @param bufferedReader
* @return
* @throws IOException
*/
default String process1(BufferedReader bufferedReader) throws IOException {
return "";
}
}
此时IDE是没有任何错误的(当然代码没有错误)
截止到此时,我们出程序中的@FunctionalInterface
一丢丢的作用,其实@FunctionalInterface
注解的作用只是告诉IDE检查这个接口,保证该接口只能包含一个
抽象方法,否则就会编译出错。
如何理解一个
抽象方法的含义。
是否能只不包含抽象方法?
我们继续修改刚才的代码,注释掉唯一的一个抽象方法
@FunctionalInterface
public interface BufferedReaderProcessor {
/**
* 静态方法
*/
static void process() {
System.out.println("process");
}
// /**
// * 抽象方法
// *
// * @param bufferedReader
// * @return
// * @throws IOException
// */
// String process(BufferedReader bufferedReader) throws IOException;
/**
* 默认方法
*
* @param bufferedReader
* @return
* @throws IOException
*/
default String process1(BufferedReader bufferedReader) throws IOException {
return "";
}
}
此时,IDE给了错误提示了:No target method found
(没有找到目标方法),也就是说,一旦使用@FunctionalInterface
注解接口,我们必须要提供一个抽象方法。
是否能提供多个抽象方法?
刚刚我们看到了,一旦接口@FunctionalInterface
,我们接口必须包含抽象方法,那么是否能包含多个抽象方法呢,我们看下面代码。
@FunctionalInterface
public interface BufferedReaderProcessor {
/**
* 静态方法
*/
static void process() {
System.out.println("process");
}
/**
* 抽象方法
*
* @param bufferedReader
* @return
* @throws IOException
*/
String process(BufferedReader bufferedReader) throws IOException;
/**
* 抽象方法
*
* @return
*/
String process1();
/**
* 默认方法
*
* @param bufferedReader
* @return
* @throws IOException
*/
default String process1(BufferedReader bufferedReader) throws IOException {
return "";
}
}
此时ide提示Multiple non-overriding abstract methods found in XXX
(找到多个非重载的抽象方法),也就是说,一个接口一旦注解了@FunctionalInterface
就只能有一个抽象方法。
评论 (0)