本篇文章主要从三个方面对函数式接口进行描述,分别为定义、声明和用途。
定义
函数式接口(Functional Interface FI):只含有一个抽象方法的接口为函数式接口。
注:接口中的声明的方法,默认的修饰符是public abstract
接口中的定义的变量,默认的修饰符是public static final
声明
Java8提供了@FunctionalInterface注解, 为了让编译器帮助我们检查确保一个接口满足FI的要求,即接口中有且仅有一个抽象方法。
举个示例:
Java1.8中的Consumer接口如下:
@FunctionalInterface
public interface Consumer {
void accept(T t);
default Consumer andThen(Consumer super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
Consumer接口中有个默认方法,即函数式接口中可以定义默认方法。这得益于java8对于接口的增强。
同时函数式接口中可以定义静态方法以及重载Object类中的方法。
用途
函数式接口主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
Lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
Lambda的语法表达格式为:
(parameters) -> expression
或
(parameters) ->{ statements; }
和内部类一样,Lambda也可以访问外部(词法作用域)变量,规则基本一样。Java8之前,内部类只能访问final类型的变量,Java8放宽了这种限制,只要变量实际上不可变(effectively final)就可以。换句话说,如果你给变量加上final关键字编译器也不报错,那么去掉final关键字后,它就是effectively final的。
下面的例子是调用Consumer接口中的accept方法。实现对于输入的数据的打印。
public static void test() {
Consumer consumer = (x) -> {System.out.println(x);};
consumer.accept(10);
}