supplier接口核心是按需生成对象,调用get()时才执行构造逻辑,实现懒加载;支持lambda封装、构造方法引用、配合optional提供默认值及作为工厂方法参数提升灵活性。

Supplier 接口的核心作用就是按需生成对象——它不立刻创建,只在调用 get() 时才执行构造逻辑。这种“懒加载”机制能避免无谓的资源开销,特别适合初始化耗时、依赖外部条件或使用频率低的对象。
用 Lambda 表达式封装构造逻辑
直接把对象创建过程写成 Lambda,get() 调用时才执行:
- String str = (() -> "Hello").get(); —— 简单值,立即返回
-
List
list = (() -> new ArrayList()).get(); —— 每次 get 都新建一个空列表 - Connection conn = (() -> DriverManager.getConnection(url)).get(); —— 延迟到真正需要数据库连接时才发起连接
用构造方法引用替代重复 new
对无参构造器,Class::new 是最简洁、零开销的方式,JVM 可内联优化,不经过反射或泛型擦除:
- Supplier
> listSup = ArrayList::new; -
Supplier
personSup = Person::new; (前提是 Person 有无参构造) - ArrayList
list = listSup.get(); // 等价于 new ArrayList()
配合 Optional 提供默认对象
当可能为空时,用 orElseGet(Supplier) 替代 orElse,确保默认值仅在必要时才创建:
- String name = Optional.ofNullable(getName()).orElseGet(() -> createDefaultName());
- 如果 getName() 返回非 null,createDefaultName() 根本不会执行
- 比 orElse(new ExpensiveObject()) 更安全——后者无论是否用得上都会实例化
封装为通用工厂方法复用
把 Supplier 当作参数传入,让调用方决定怎么造对象,提升灵活性和可测试性:
- public static
T create(Supplier factory) { return factory.get(); } - List
data = create(() -> loadFromCache()); - Logger logger = create(LoggerFactory::getLogger);
- 测试时可轻松注入模拟对象:create(() -> new MockService())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











