函数式接口

本文最后更新于 2025年5月20日 14:24

什么是函数式接口

函数式接口是Java 8引入的概念,指只包含一个抽象方法的接口。这些接口可以使用Lambda表达式来表示,使代码更加简洁。

函数式接口的特点:

  • 只有一个抽象方法(Single Abstract Method,简称SAM)
  • 可以有多个默认方法或静态方法
  • 通常使用@FunctionalInterface注解标记(非必须,但推荐使用)

Java内置的常用函数式接口

Java 8 在 java.util.function 包中提供了许多预定义的函数式接口:

  1. Consumer - 接收一个参数,无返回值

    1
    2
    Consumer<String> consumer = s -> System.out.println(s);
    consumer.accept("你好"); // 输出: 你好
  2. Supplier - 无参数,返回一个结果

    1
    2
    Supplier<String> supplier = () -> "当前时间: " + System.currentTimeMillis();
    String result = supplier.get(); // 获取当前时间字符串
  3. Function<T, R> - 接收一个参数,返回一个结果

    1
    2
    Function<String, Integer> function = s -> s.length();
    Integer length = function.apply("测试字符串"); // 返回: 5
  4. Predicate - 接收一个参数,返回布尔值

    1
    2
    Predicate<String> predicate = s -> s.length() > 5;
    boolean result = predicate.test("你好世界"); // 返回: false
  5. BiFunction<T, U, R> - 接收两个参数,返回一个结果

    1
    2
    BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
    Integer sum = add.apply(5, 3); // 返回: 8

自定义函数式接口

你可以创建自己的函数式接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@FunctionalInterface
interface MyMathOperation {
int operate(int a, int b);

// 可以有默认方法
default void printInfo() {
System.out.println("这是一个数学操作接口");
}
}

// 使用自定义函数式接口
MyMathOperation addition = (a, b) -> a + b;
MyMathOperation subtraction = (a, b) -> a - b;

System.out.println(addition.operate(10, 5)); // 输出: 15
System.out.println(subtraction.operate(10, 5)); // 输出: 5

函数式接口的实际应用

1. 作为方法参数

1
2
3
4
5
6
public static void processString(String str, Consumer<String> processor) {
processor.accept(str);
}

// 调用方法
processString("你好世界", s -> System.out.println(s.toUpperCase()));

2. 在Stream API中使用

1
2
3
4
5
6
7
8
9
10
11
List<String> names = Arrays.asList("张三", "李四", "王五", "赵六");

// 使用Predicate过滤
List<String> filtered = names.stream()
.filter(name -> name.length() == 2)
.collect(Collectors.toList()); // 结果: [张三, 李四, 王五, 赵六]

// 使用Function转换
List<Integer> lengths = names.stream()
.map(name -> name.length())
.collect(Collectors.toList()); // 结果: [2, 2, 2, 2]

3. 在CompletableFuture中使用

1
2
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "原始数据");
CompletableFuture<String> result = future.thenApply(data -> data + " - 已处理");

函数式接口的优势

  1. 代码简洁:减少了匿名内部类的冗余代码
  2. 提高可读性:使代码的意图更加清晰
  3. 便于并行处理:特别适合流式操作和并行计算
  4. 灵活组合:函数可以作为参数传递,便于组合使用

函数式接口和Lambda表达式是Java向函数式编程迈出的重要一步,掌握它们将大大提升你的编程效率和代码质量。


函数式接口
http://example.com/2025/04/22/函数式接口/
作者
Moonike
发布于
2025年4月22日
更新于
2025年5月20日
许可协议