什么是函数式接口
函数式接口就是一个有且仅有一个抽象方法有且仅有一个抽象方法
,但是可以有多个非抽象方法的接口,是Lambda表达式的实现前提,可以使用@FunctionalInterface
注解修饰
JDK8之前的函数式接口
JDK8之前也存在函数式接口,在JDK8升级之后这些接口头部都加上了@FunctionalInterface修饰,如下:
- • java.lang.Runnable【熟悉吧,创建线程】
- • java.util.concurrent.Callable【创建线程】
- • java.security.PrivilegedAction【执行计算】
- • java.util.Comparator【Lambda一篇说过的 比较器】
- • java.io.FileFilter【文件过滤器】
- • java.nio.file.PathMatcher【路径匹配】
- • java.lang.reflect.InvocationHandler【动态代理】
- • java.beans.PropertyChangeListener【属性变化监听器】
- • java.awt.event.ActionListener【事件监听器】
- • javax.swing.event.ChangeListener【change事件监听】
自定义函数式接口
函数式接口就是有且仅有一个抽象方法,默认实现和静态方法不影响它是一个函数式接口【JDK8支持接口有默认方法和静态方法】
• 接口,定义抽象即可,所以我这里都使用泛型,可以根据自己的需求定义,如果需求要限制类型也可以直接定义成具体的类型
package com.stt.function.myfunction;
/**
* 自定义函数式接口:
* 定义:
* 1、接口中只有一个抽象方法
* 2、可以使用@FunctionInterface注释修饰,也可以不使用
* 如果使用该注解报错,说明该接口不是一个函数式接口
*/
@FunctionalInterface
public interface SttFunction<T,R,V> {
/**
* 接收两个参数,并返回一个参数
* 注意:接口嘛,定义个大概就行了,具体什么参数,怎么返回就不需要说明了,具体实现的时候再说呗
*/
V calc(T t,R r);
}
包含默认实现的函数式接口
package com.stt.function.myfunction;
/**
* 自定义函数式接口:
* 定义:
* 1、接口中只有一个抽象方法
* 2、可以使用@FunctionInterface注释修饰,也可以不使用
* 如果使用该注解报错,说明该接口不是一个函数式接口
*/
@FunctionalInterface
public interface SttFunction<T,R,V> {
/**
* 接收两个参数,并返回一个参数
* 注意:接口嘛,定义个大概就行了,具体什么参数,怎么返回就不需要说明了,具体实现的时候再说呗
*/
V calc(T t,R r);
default void defaultMethod() {
System.out.println("也不知道实现点什么,反正JDK8之后可以有默认实现!");
}
static void staticMethod() {
System.out.println("同样不知道写点什么,反正JDK8之后可以有静态方法!");
}
}
@FunctionalInterface注解
Java 8中专门为函数式接口引入了一个新的注解:@FunctionalInterface 。该注解放在接口上,表示此接口是一个函数式接口。并且提示编译器去检查接口是否仅包含一个抽象方法,即,是否符合函数式编程的定义