函数式接口是Java8对java8对一类特殊类型的接口的称呼.这类接口定义了唯一的抽象方法的接口.函数式接口代表一种契约,一种对某个特定函数类型的契约.在它出现的地方,实际期望一个符合契约要求的函数.这个注解主要用于编译器错误检查,加上该注解后,当写的接口不符合函数式接口定义的时候会报错
JDK8之前已有的函数式接口
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
java8新定义的函数式接口
Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t)
Consumer -- 传入一个参数,无返回值,纯消费。 方法为void accept(T t)
Function -- 传入一个参数,返回一个结果,方法为R apply(T t)
Supplier -- 无参数传入,返回一个结果,方法为T get()
UnaryOperator -- 一元操作符, 继承Function,传入参数的类型和返回类型相同。
BinaryOperator -- 二元操作符, 传入的两个参数的类型和返回类型相同, 继承BiFunction
用法
函数式接口可以额外定义多个抽象方法,但是这些抽象方法签名必须和Object的public方法一样.为什么要这样规定呢?原因在于接口最终都有确定的类实现而类的最终父类是Object.因此函数式接口可以定义Object的public方法
@FunctionalInterface
public interface ObjectMethodFunctionalInterface {
void count(int i);
String toString();
int hashCode();
boolean equals(Object o);
}
示例
@FunctionalInterface
interface FunctionalException {
void apply(int i) throws Exception;
}
public class FunctionalTest {
public static void main(String[] args) {
FunctionalException functionalInterface = i -> {
System.out.println("apply");
};
try {
functionalInterface.apply(10);
} catch (Exception e) {
e.printStackTrace();
}
}
}