Supplier用于按需延迟创建对象,核心是调用get()时才执行逻辑;适用于数据库连接、大对象构建、Optional.orElseGet、Stream.generate等场景,但不保证线程安全或结果缓存。

Supplier 就是用来“按需提供一个对象”的——不传参数,只在调用 get() 时才执行逻辑、返回结果。它不是用来提前创建对象的,而是把创建动作推迟到真正需要那一刻。
核心用法:延迟生成结果
Supplier 最自然的用途,就是把一段可能耗时或依赖外部条件的逻辑包起来,等要用时再触发:
- 数据库连接、文件读取、远程调用这类操作,适合用 Supplier 包装,避免初始化阶段就失败或阻塞
- 构造开销大的对象(如大型集合、解析后的配置),用 Supplier 控制实际构建时机
- 配合 if/else 或 Optional 的 orElseGet 等方法,实现“有则用,无则造”的默认值策略
常见搭配场景
和 Optional 配合防空:
当值可能为空时,用 orElseGet(Supplier) 替代 orElse,避免无谓的对象创建:
String result = name.orElseGet(() -> "default"); // 只有 name 为空才执行 lambda
在 Stream 中动态生成数据:
比如用 Supplier + Stream.generate 创建无限流,或配合 iterate 构建序列:
立即学习“Java免费学习笔记(深入)”;
Stream.generate(() -> Math.random()).limit(5)
.forEach(System.out::println);
工厂式对象创建
Supplier 天然适合作为轻量级工厂接口,尤其适合无状态、配置驱动的对象生成:
- 直接写
() -> new UserServiceImpl(),比写个 UserServiceFactory 类更简洁 - 可传入方法参数、存进 Map 或 List,实现运行时策略切换
- 配合依赖注入框架(如 Spring)时,常作为 @Bean 方法的返回类型,表达“每次请求都新建”或“单例复用”的语义
注意点与边界
Supplier 本身不保证线程安全,也不承诺每次 get() 都返回新实例:
- 如果需要线程安全的懒加载单例,别手写双重检查,优先考虑
Lazy<t></t>、AtomicReference或 Spring 的 @Scope("singleton") - Supplier 不是缓存机制——想缓存结果得自己加逻辑,比如用内部变量判空,但要注意并发问题
- 不要在 Supplier 里做副作用操作(如修改外部状态、发通知),它语义上只是“供给”,行为应尽量纯


















