WMX · 随记
·Java· 3 分钟阅读

Optional 的默认值:orElse 会先算好再传入

某个缓存命中时,默认数据的数据库查询仍然发生,可能是因为把查询写进了 orElse。方法参数在进入方法前就会被求值。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Tutorial for Beginners

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

某个缓存命中时,默认数据的数据库查询仍然发生,可能是因为把查询写进了 orElse。方法参数在进入方法前就会被求值。

理解核心机制

orElse 接收一个已经计算好的值;orElseGet 接收 Supplier,只有 Optional 为空时才请求默认值。默认表达式很便宜时,两者区别不大,但涉及 I/O 或副作用时应该有意识地选择。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java12 行 · 可横向滚动
import java.util.Optional;
public class Demo {
    static String fallback() {
        System.out.println("fallback computed");
        return "guest";
    }
    public static void main(String[] args) {
        var name = Optional.of("Ada");
        System.out.println(name.orElse(fallback()));
        System.out.println(name.orElseGet(Demo::fallback));
    }
}

适用边界与常见误区

Optional 主要用于表达返回值可能缺失,不应把所有字段和参数机械包起来。Optional 本身也不应该是 null。

继续练习

把 Optional.of 改成 empty,计数 fallback 的调用次数;为昂贵默认值增加一个能识别多余调用的测试。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档