Java 8 引入的 Optional<T> 主要是用来显式表达“可能为空的值”,避免 NullPointerException,并鼓励更函数式的写法。下面从优点和缺点两方面说。
比直接用 null 更清晰:
// 以前
User user = getUser();
if (user != null) {
...
}
// 现在
Optional<User> user = getUser();
调用方一眼就知道:这个返回值可能不存在。
强制你在使用前考虑“空”的情况:
Optional<User> user = getUser();
user.ifPresent(u -> System.out.println(u.getName()));
比忘记 null 检查更安全。
可以优雅处理默认值、转换:
String name = getUser()
.map(User::getName)
.orElse("Unknown");
或:
getUser()
.filter(u -> u.isActive())
.ifPresent(this::sendEmail);
方法签名自带语义:
Optional<Order> findOrderById(String id);
比 Order findOrderById(...) 更明确。
官方推荐:Optional 用于返回值,不用于参数和字段。
如果到处用 Optional:
Optional<String> name = Optional.of("Tom");
本来就不是空,却硬包一层,反而更啰嗦。
Optional 最初没有实现 Serializable,不能直接用在:
(Java 9+ 部分改善,但仍不推荐作为 DTO 字段)
反例:
class User {
Optional<String> email; // 不推荐
}
void send(Optional<String> msg) { // 不推荐
}
原因:
✅ 正确做法:
String email(可为 null 或非空约束)Optional 是对象包装:
错误思维:
“用了 Optional 就安全了”
其实:
optional.get(); // 仍可能 NoSuchElementException
✅ 推荐用
❌ 不推荐用
List<Optional<T>> 是反模式)✅ 最佳实践
Optional<User> user = repo.findById(id);
String name = user.map(User::getName).orElse("default");
Optional 不是用来消灭 null,而是用来“显式表达可能没有值”的工具。用对地方很香,滥用很坑。
如果你愿意,我也可以给你Optional 常见误用示例 + 正确写法对照表。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。