Java 1.8 Supplier 函数式接口

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

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1800+ 小伙伴加入学习 ,欢迎点击围观

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 接口特别适用于懒加载、产生随机值、序列号等场景。