lambda 表达式本身不实现懒加载,但可作为延迟计算的封装载体,配合 supplier 等函数式接口,在调用 get() 时才执行逻辑,从而自然支持懒加载。

Java 中 Lambda 表达式本身不直接“实现懒加载”,但它非常适合作为**延迟计算的封装载体**,配合函数式接口(如 Supplier<t></t>)和按需调用机制,自然地支撑懒加载逻辑。
用 Supplier 封装延迟计算逻辑
Supplier<t></t> 是最常用的懒加载接口:它不接收参数、只在调用 get() 时才执行逻辑并返回结果。Lambda 可以简洁地定义这个“待执行的动作”:
- 把耗时操作(如数据库查询、文件读取、复杂对象构建)写在 Lambda 里,但不立即执行
- 将该 Lambda 赋值给
Supplier类型变量或字段,保存为“可执行的承诺” - 真正需要值时,才调用
supplier.get()—— 此刻才触发计算
示例:
Supplier- > userLoader = () -> fetchUsersFromDatabase(); // 定义即完成,未执行
List
结合双重检查锁实现线程安全的懒加载
若需“只初始化一次”,可在类中用 volatile + Supplier + 同步块组合实现单例式懒加载:
- 声明
private volatile Supplier<data> dataSupplier</data>和private volatile Data cachedData - 提供一个
getData()方法:先检查cachedData是否为空;为空则加锁,再次检查后调用dataSupplier.get()并缓存结果 - Lambda 在初始化时传入,例如:
dataSupplier = () -> new HeavyData();
这样既延迟了创建时机,又保证了线程安全与仅执行一次。
用 Optional + Supplier 实现条件性懒加载
当加载逻辑可能失败或需兜底时,可结合 Optional 和 Supplier:
Optional.ofNullable(configValue).orElseGet(() -> loadDefaultValue())-
orElseGet接收Supplier,仅在configValue为 null 时才执行 Lambda 中的加载逻辑 - 避免了无条件执行默认值构造(比如 new 大对象),真正按需触发
注意:Lambda 不是自动懒加载,调用才是关键
容易误解的一点:写个 Lambda 并不等于“已懒加载”。它只是定义了一个动作。是否懒,取决于你何时、是否调用它:
- ❌ 错误:直接执行
String s = (() -> expensiveOperation()).get();—— 立即执行,不懒 - ✅ 正确:先保存
Supplier<string> lazy = () -> expensiveOperation();</string>,后续按需lazy.get() - Lambda 的价值在于轻量、可传递、可复用 —— 让你方便地把“怎么算”推迟到“要结果的时候”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











