lambda 表达式通过延迟封装和按需执行高成本操作(如解析、格式化、远程调用)来提升性能;典型应用包括 orelseget() 替代 orelse()、supplier 封装日志消息、自定义 lazyconverter 接口。

Lambda 表达式本身不“转换变量”,但它能将一段计算逻辑(比如类型转换、格式化、拼接、远程调用等)**延迟封装、按需执行**,从而避免在不需要时做无谓运算,直接减少 CPU 占用、内存分配和 I/O 等开销,最终提升系统响应速度。关键不是“转换器”本身,而是“何时执行转换”。
用 Supplier 封装转换逻辑,只在真正需要时触发
当某个值的生成代价较高(如 JSON 解析、日期格式化、数据库查询),又可能被跳过(比如日志未开启、缓存命中、条件不满足),就该用 Supplier
- 把耗时操作写进 Lambda:
() -> JSON.parse(jsonStr)或() -> sdf.format(new Date()) - 传入方法时只是传递一个“待执行的动作”,不立刻执行
- 接收方根据业务逻辑决定是否调用
.get()—— 这才是真正的转换执行点
替换 orElse() 为 orElseGet(),避免无效远程调用
本地缓存 + 外部兜底是典型场景。错误写法会强制调用外部接口:
-
Double value = Optional.ofNullable(localValue).orElse(getRemoteValue());→ 无论缓存是否存在,getRemoteValue() 都执行 - 正确写法:
Double value = Optional.ofNullable(localValue).orElseGet(() -> getRemoteValue());→ 仅当 localValue 为 null 时,才执行 Lambda 内的远程调用
这省下的不只是一次网络往返,还有连接池占用、线程等待、序列化反序列化等整条链路开销。
日志/调试类场景:避免字符串拼接和对象构建浪费
比如 logger.debug("User " + user.getId() + " accessed " + resource.getName());,即使 debug 级别关闭,拼接和 user.getId()、resource.getName() 仍会执行。
- 优化方式:定义支持 Supplier 的日志方法
debug(Supplier<string> msg)</string> - 调用时写成
logger.debug(() -> "User " + user.getId() + " accessed " + resource.getName()); - 只有日志级别允许输出时,Lambda 才会被
.get()触发,否则整段逻辑被跳过
自定义延迟转换器接口,统一管理高成本操作
如果项目中多处存在类似“字符串 → 金额”、“ID → 用户对象”、“原始数据 → DTO”等转换,可抽象为:
- 定义函数式接口:
@FunctionalInterface interface LazyConverter<t> { T convert(); }</t> - 构造时捕获上下文:
LazyConverter<bigdecimal> amount = () -> parseAmount(rawText);</bigdecimal> - 使用时才执行:
if (shouldValidate()) { amount.convert().setScale(2); }
这样既保持调用简洁,又把执行时机完全交给业务判断,不增加额外反射或配置成本。










