函数式接口

函数式接口

介绍

函数式接口(Functional Interface)是指只包含一个抽象方法的接口,通常用于支持JavaLambda表达式和方法引用特性。在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("电影结束");
    }
}

注意事项(*重点)

  1. *函数式接口只能有一个抽象方法,如果有多个抽象方法则不再是函数式接口。
  2. *函数式接口可以有默认方法和静态方法。
  3. 可以使用@FunctionalInterface注解标记一个接口为函数式接口,但这不是必需的。
  4. *由于函数式接口中只有一个抽象方法,因此可以使用Lambda表达式或方法引用来表示该方法的实现。
  5. 函数式接口可以作为方法参数或返回值类型。(如果对这个不明白,就回去看继承)
  6. 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类型的数据;前者称为前置条件,后者称为后置条件。