supplier是java 8引入的无参函数式接口,用于延迟生成指定类型对象,仅含get()方法,支持lambda、方法引用等实现,适用于惰性求值、避免空指针及测试模拟等场景。

Supplier 是 Java 8 引入的函数式接口,核心作用是“无参生成一个对象”,不接收任何输入,只返回一个指定类型的实例。
Supplier 的基本用法
它只有一个抽象方法 get(),返回泛型类型 T 的对象。你可以用 Lambda 表达式、方法引用或匿名内部类实现它:
- 用 Lambda 创建一个随机字符串 Supplier:
Supplier<string> stringGen = () -> UUID.randomUUID().toString();</string>
调用stringGen.get()每次都会生成新 UUID 字符串。 - 用构造方法引用创建 ArrayList 实例:
Supplier<list>> listSupplier = ArrayList::new;</list>
每次调用listSupplier.get()都返回一个空的ArrayList。 - 用已有方法引用(如静态工厂):
Supplier<localdatetime> now = LocalDateTime::now;</localdatetime>
Supplier 常见应用场景
它适合用于延迟初始化、避免空指针、解耦对象创建逻辑等场景:
-
惰性求值:配合
Optional.orElseGet(Supplier),只在需要时才创建默认对象,避免无谓开销。
例如:optional.orElseGet(() -> new ExpensiveObject())。 -
避免 null 判断:封装可能为 null 的对象创建逻辑,让调用方统一通过
get()获取安全实例。 - 测试中模拟对象生成:比如每次调用都返回不同 ID 的 User 对象,便于单元测试数据隔离。
Supplier 和 new 的区别
直接 new X() 是立即执行并返回实例;而 Supplier<x></x> 是一个“生成契约”——它本身不创建对象,只有调用 get() 时才触发创建逻辑。这带来了延迟性、可复用性和组合能力(比如和 Function 链式处理)。
自定义 Supplier 的注意事项
如果实现复杂逻辑(如带状态、需线程安全),要注意:
- Supplier 设计上应是无副作用的,多次调用
get()理论上可返回不同实例(如时间、随机数),但不应修改外部状态。 - 若需线程安全的对象池或单例语义,Supplier 本身不保证,要自行加锁或使用
ThreadLocal等机制。 - 不要在 Supplier 中抛出受检异常;如需处理异常,可包装成运行时异常,或改用自定义函数接口。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











