介绍
函数式接口(Functional Interface)
是指只包含一个抽象方法的接口,通常用于支持Java
的Lambda
表达式和方法引用特性。在Java中,可以使用@FunctionalInterface
注解来标识一个接口为函数式接口。
补充
函数式接口的出现是为了支持Lambda
表达式,Lambda
表达式可以被认为是函数式接口的一种实现方式。通过Lambda
表达式,可以将一个函数作为参数传递给另一个函数,或者直接返回一个函数。
语法+在静态代理中的使用
public class Test {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
// 创建时调用构造方法传入realSubject对象
Subject proxySubject = new ProxySubject(realSubject);
// 通过调用doSomething方法在ProxySubject对象的内部调用RealSubject类的doSomething方法
proxySubject.doSomething();
}
}
// 函数式接口
@FunctionalInterface
interface Subject {
void doSomething();
}
// 具体实现类
class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("《流浪地球2》");
}
}
// 代理类
class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject) {
this.subject = subject;
}
@Override
public void doSomething() {
System.out.println("电影广告");
//调用具体实现类的方法
subject.doSomething();
System.out.println("电影结束");
}
}
注意事项(*
重点)
*
函数式接口只能有一个抽象方法,如果有多个抽象方法则不再是函数式接口。*
函数式接口可以有默认方法和静态方法。- 可以使用@FunctionalInterface注解标记一个接口为函数式接口,但这不是必需的。
*
由于函数式接口中只有一个抽象方法,因此可以使用Lambda表达式或方法引用来表示该方法的实现。- 函数式接口可以作为方法参数或返回值类型。(如果对这个不明白,就回去看继承)
- Java 8中提供了一些预定义的函数式接口,如Consumer、Predicate、Function等。
常用的JDK函数式接口
1)Supplier<T>
接口
Supplier是一个供给型接口(生产型接口)。用来获取一个泛型参数指定类型的对象数据。也就是说,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据返回。
2)Consumer<T>
接口
Consumer是一个消费型接口。与Supplier接口相反,它不是用于生产一个数据,而是用于消费一个数据。当泛型指定什么类型,就可以使用accept方法消费什么类型的数据。至于具体怎么消费,根据需求实现。
3)Predicate<T>
接口
Predicate是一个断定型接口。用于对某种数据类型的数据进行判断,结果返回一个boolean值。符合判断,返回True,否则为False。
4)Function<T, R>
接口
Function是一个函数型接口。用于根据一个T类型的数据得到另一个R类型的数据;前者称为前置条件,后者称为后置条件。