跳到主要内容

Java函数式接口

介绍

Java 8 引入了函数式编程的概念,其中函数式接口(Functional Interface)是这一特性的核心组成部分。函数式接口是指仅包含一个抽象方法的接口。通过函数式接口,Java 支持将函数作为参数传递、将代码作为数据处理的能力,从而简化代码并提高可读性。

备注

函数式接口可以有多个默认方法或静态方法,但只能有一个抽象方法。

函数式接口的定义

Java 提供了一个注解 @FunctionalInterface,用于显式声明一个接口为函数式接口。编译器会检查该接口是否符合函数式接口的定义。

java
@FunctionalInterface
interface Greeting {
void sayHello(String name);
}

在上面的例子中,Greeting 接口是一个函数式接口,因为它只包含一个抽象方法 sayHello

内置函数式接口

Java 8 提供了许多内置的函数式接口,位于 java.util.function 包中。以下是一些常用的内置函数式接口:

  1. Consumer<T>:接受一个输入参数并返回无结果的操作。
  2. Supplier<T>:不接受参数,但返回一个结果。
  3. Function<T, R>:接受一个输入参数并返回一个结果。
  4. Predicate<T>:接受一个输入参数并返回一个布尔值。

示例:使用 Consumer<T>

java
import java.util.function.Consumer;

public class ConsumerExample {
public static void main(String[] args) {
Consumer<String> printMessage = message -> System.out.println(message);
printMessage.accept("Hello, World!");
}
}

输出:

Hello, World!

示例:使用 Function<T, R>

java
import java.util.function.Function;

public class FunctionExample {
public static void main(String[] args) {
Function<Integer, Integer> square = x -> x * x;
System.out.println(square.apply(5));
}
}

输出:

25

Lambda 表达式与函数式接口

Lambda 表达式是函数式接口的具体实现。它允许你以简洁的方式实现函数式接口的抽象方法。

java
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}

public class LambdaExample {
public static void main(String[] args) {
MathOperation addition = (a, b) -> a + b;
System.out.println(addition.operate(10, 5));
}
}

输出:

15

实际应用场景

1. 集合操作

Java 8 引入了 Stream API,它大量使用了函数式接口。例如,forEach 方法接受一个 Consumer<T> 参数。

java
import java.util.Arrays;
import java.util.List;

public class StreamExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
}
}

输出:

Alice
Bob
Charlie

2. 线程创建

使用 Runnable 接口(也是一个函数式接口)创建线程。

java
public class ThreadExample {
public static void main(String[] args) {
Runnable task = () -> System.out.println("Running in a thread");
new Thread(task).start();
}
}

输出:

Running in a thread

总结

函数式接口是 Java 8 引入的一个重要特性,它使得 Java 能够支持函数式编程风格。通过内置的函数式接口和 Lambda 表达式,开发者可以编写更简洁、更具表达力的代码。在实际开发中,函数式接口广泛应用于集合操作、线程创建等场景。

附加资源与练习

  1. 练习:尝试定义一个自定义的函数式接口,并使用 Lambda 表达式实现它。
  2. 深入学习:阅读 java.util.function 包中其他函数式接口的文档,了解它们的用途。
  3. 扩展知识:学习 Java Stream API,了解如何结合函数式接口进行数据处理。
提示

函数式接口与 Lambda 表达式是 Java 8 的核心特性之一,熟练掌握它们将极大地提升你的编程能力。