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

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

















