supplier是java中实现懒加载最轻量自然的方式:不接收参数、只返回值,调用get()时才执行逻辑,适用于延迟初始化、配合optional/stream求值等场景。

Java 中的 Supplier 是一个最典型的供给型函数式接口,核心就一条:不收参数,只管“给”——调用 get() 方法时才执行逻辑、返回结果。它不是立刻干活,而是“等你开口才动手”,这个特性让它特别适合延迟计算、按需生成、避免空值等实际场景。
Supplier 的基本写法和常见初始化方式
Supplier 是泛型接口,声明为 Supplier<t></t>,其中 T 是你要提供的结果类型。它只有一个抽象方法 T get(),所以可以用 Lambda、方法引用或匿名内部类实现:
- 用 Lambda 表达式(最常用):
Supplier<string> strSupplier = () -> "Hello";</string>
调用strSupplier.get()就返回"Hello" - 用方法引用(简洁清晰):
Supplier<long> timeSupplier = System::currentTimeMillis;</long>
每次调用get()都返回当前毫秒时间戳 - 用带逻辑的 Lambda(支持复杂操作):
Supplier<list>> randList = () -> {<br> return IntStream.range(0, 5)<br> .mapToObj(i -> (int)(Math.random() * 100))<br> .collect(Collectors.toList());<br>};</list>
Supplier 最实用的三个使用场景
它不是炫技工具,而是解决具体问题的“懒人开关”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
延迟初始化对象:比如某个大对象创建开销高,又不一定用得上,就用 Supplier 包一层,真正需要时再 new
private final Supplier<databaseconnection> connSupplier = () -> new DatabaseConnection();<br>public DatabaseConnection getConnection() { return connSupplier.get(); }</databaseconnection> -
配合 Optional 提供默认值:比直接传常量更灵活,且只在为空时才执行
String name = Optional.ofNullable(user.getName())<br> .orElseGet(() -> generateDefaultName()); // generateDefaultName() 只在 name 为 null 时调用
-
生成测试数据或随机值:可复用、可配置、不污染主流程
List<integer> numbers = IntStream.range(0, 10)<br> .mapToObj(i -> randomSupplier.get())<br> .collect(Collectors.toList());</integer>
Supplier 和其他函数式接口的关键区别
别把它和 Consumer、Function 搞混——Supplier 的“无入有出”是唯一标识:
-
Supplier
:不收参数,返回 T(只供给) -
Consumer
:收一个 T,不返回(只消费) -
Function
:收 T,返回R(转换) -
Predicate
:收 T,返回boolean(判断)
记牢一点:Supplier 是整条函数式流水线的“源头”,负责把第一个值“生出来”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










