Java 函数式接口(Functional Interface)及其使用

Java 8 引入了函数式编程的概念,其中的核心是函数式接口(Functional Interface)。函数式接口是指只包含一个抽象方法的接口,它可以被用作 lambda 表达式的类型。

什么是函数式接口?

函数式接口是指只包含一个抽象方法的接口。在 Java 中,函数式接口使用 @FunctionalInterface 注解进行标记。这个注解是可选的,但推荐使用,因为它可以确保接口仅包含一个抽象方法。

例如,下面是一个简单的函数式接口定义:

@FunctionalInterface
public interface MyFunction {
    void doSomething();
}

这个接口只有一个抽象方法 doSomething(),我们可以使用 lambda 表达式实现该接口的方法。

函数式接口的作用

函数式接口的作用是可以简化代码并提高可读性。它们为我们提供了一种将行为传递给方法的能力,使得代码更加灵活和可复用。

举个例子,假设我们有一个需求:根据用户的不同需求来执行不同的操作。我们可以使用函数式接口来实现这个需求。

首先,定义一个函数式接口 CustomerFunction,并声明一个抽象方法 execute()

@FunctionalInterface
public interface CustomerFunction {
    void execute();
}

然后,我们可以编写一个方法 process(),接受一个 CustomerFunction 对象作为参数,并调用它的 execute() 方法:

public void process(CustomerFunction customerFunction) {
    customerFunction.execute();
}

接下来,我们可以创建不同的 CustomerFunction 的实例,并将它们作为参数传递给 process() 方法:

CustomerFunction function1 = () -> System.out.println("执行操作1");
CustomerFunction function2 = () -> System.out.println("执行操作2");

process(function1); // 输出:执行操作1
process(function2); // 输出:执行操作2

这样,我们就可以根据不同的需求来执行不同的操作,而无需编写大量的重复代码。

内置的函数式接口

Java 8 提供了一些内置的函数式接口,它们位于 java.util.function 包中。这些接口可以直接使用,无需自己定义。

  • Consumer<T>:消费一个参数,无返回值。
  • Supplier<T>:无参数,返回一个结果。
  • Function<T, R>:接受一个参数,返回一个结果。
  • Predicate<T>:断言某个条件是否满足。
  • BiConsumer<T, U>:消费两个参数,无返回值。
  • BiFunction<T, U, R>:接受两个参数,返回一个结果。

Consumer<T> 为例,它是一个消费型接口,可以接受一个参数并执行一些操作,没有返回值。

Consumer<String> consumer = (str) -> System.out.println(str.toUpperCase());
consumer.accept("hello"); // 输出:HELLO

总结

函数式接口是 Java 8 引入的一个重要概念,它可以简化代码并提高可读性。函数式接口只包含一个抽象方法,可以被用作 lambda 表达式的类型。

通过定义自己的函数式接口,我们可以将行为传递给方法,实现更加灵活和可复用的代码。

同时,Java 8 也提供了一些内置的函数式接口,它们位于 java.util.function 包中,可以直接使用。

希望本文能帮助您理解函数式接口及其在 Java 中的使用。

参考资料:

  • [Java 8 Lambda Expressions and Functional Interfaces](
  • [Java 8 Functional Interfaces](