Optional 是 Java 8 引入的一个容器类,用来显式表达“可能有值,也可能没有值”,核心目的是减少 null 带来的歧义和空指针问题。
在传统 Java 中:
User user = getUser();
String name = user.getName(); // 可能 NPE
问题:
null 含义模糊(是没有数据?还是出错了?)Optional 的设计目标是:
让“可能为空”这件事在类型层面可见
Optional<String> opt = Optional.of("hello");
Optional 只是容器Optional.empty())Optional<User> userOpt = getUser();
你必须决定:
而不是“假装一定有值”。
传统写法:
if (user != null) {
return user.getName();
}
return "unknown";
Optional 写法:
return userOpt
.map(User::getName)
.orElse("unknown");
好处:
opt.ifPresent(System.out::println);
String name = opt.orElse("default");
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
(避免多层 if (x != null))
Stream、map、flatMap)❌ 反例:
void foo(Optional<String> name) { ... }
✅ 更好:
void foo(String name) {
if (name == null) ...
}
它只是:
⚠️ 错误用法:
optional.get(); // 可能抛 NoSuchElementException
✅ 正确用法:
optional.orElseThrow(() -> new RuntimeException("not found"));
Optional 不是为了“少写判空”,而是为了让“值可能不存在”成为明确的设计契约。
如果你愿意,我也可以结合:
null safety 的对比来进一步讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。