Java 1.8 Supplier 函数式接口

更新时间 2023-07-18 17:13:06

一则小广告

最近,小哈正在带小伙伴做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4,手把手教学,前端 + 后端全栈开发,从 0 到 1 讲解每个功能开发过程,1v1 答疑,陪伴式直到项目上线,目前第六章 《Element Plus 手搭 Admin 后台管理骨架》已快完结,截止到目前,已更新 52 节内容,共计 81557 字,演示截图:433 张,持续更新中,后续还会上新更多项目,欢迎点击加入

Supplier 接口代表一个不接受参数但返回结果的操作。它在 Java 中被广泛用于懒加载或产生随机值等场景。

本教程将深入介绍 Java 1.8 中的 Supplier 接口,并通过示例代码演示如何使用它。

Supplier 接口概览

java.util.function 包中,Supplier 接口定义如下:

@FunctionalInterface
public interface Supplier<T> {
    T get();
}
  • T 表示返回结果的类型。
  • get() 是 Supplier 接口中唯一的抽象方法,用于执行操作并返回结果。

Supplier 接口是一个泛型接口,它可以返回不同类型的结果。

使用 Supplier 接口

让我们通过几个示例来说明如何使用 Supplier 接口。

示例 1:产生随机数

创建一个 Supplier 接口实例,用于产生一个随机整数。

Supplier<Integer> randomNumberSupplier = () -> new Random().nextInt(100);
int randomNumber = randomNumberSupplier.get();
System.out.println("Random number: " + randomNumber);

在这个例子中,我们创建了一个 Supplier 对象 randomNumberSupplier,它将返回一个随机整数。我们调用 get() 方法来执行 Supplier,并产生一个随机整数并输出结果。

示例 2:懒加载

使用 Supplier 接口实现懒加载,只有在需要时才计算结果。

Supplier<String> lazyValueSupplier = () -> {
    // 复杂的计算过程
    System.out.println("Performing complex calculation...");
    // 返回结果
    return "Lazy value result";
};

// 只有在调用 get() 方法时,才会执行复杂计算
String lazyValue = lazyValueSupplier.get();
System.out.println(lazyValue);

在这个例子中,我们创建了一个 Supplier 对象 lazyValueSupplier,它代表了一个复杂的计算过程。在调用 get() 方法之前,不会进行实际的计算。只有在调用 get() 方法时,才会执行复杂计算并返回结果。

示例 3:产生序列号

使用 Supplier 接口实现产生序列号的功能。

AtomicInteger counter = new AtomicInteger();

Supplier<Integer> sequentialNumberSupplier = () -> counter.getAndIncrement();

// 产生序列号
int number1 = sequentialNumberSupplier.get();
int number2 = sequentialNumberSupplier.get();

System.out.println("Number 1: " + number1); // 输出 "Number 1: 0"
System.out.println("Number 2: " + number2); // 输出 "Number 2: 1"

在这个例子中,我们创建了一个 Supplier 对象 sequentialNumberSupplier,它使用 AtomicInteger 来产生序列号。每次调用 get() 方法,都会递增 counter 并返回递增后的值,从而实现序列号的生成。

总结

Java 1.8 中的 Supplier 接口为函数式编程提供了重要的支持。通过使用 Supplier 接口,我们可以轻松地定义并执行一个不接受参数但返回结果的操作。Supplier 接口特别适用于懒加载、产生随机值、序列号等场景。