在 Java 中,Optional 是用来更优雅地处理可能为 null 的值,避免直接使用 null 带来的 NullPointerException。下面从创建、获取、处理、常见误区几个方面说明。
Optional<T> 是一个容器对象,可能包含值,也可能为空。
Optional<String> opt = Optional.of("hello");
Optional<String> empty = Optional.empty();
Optional<String> opt = Optional.of("value");
⚠️ 如果值为 null,会直接抛 NullPointerException
Optional<String> opt = Optional.ofNullable(nullableValue);
值为 null 时,得到的是 Optional.empty()
Optional<String> opt = Optional.empty();
opt.ifPresent(value -> System.out.println(value));
String value = opt.orElse("default");
// 或(延迟计算,适合开销大的默认值)
String value = opt.orElseGet(() -> createDefault());
String value = opt.orElseThrow(() -> new RuntimeException("值不能为空"));
Optional<Integer> lengthOpt = opt
.map(String::length);
如果 opt 为空,map 直接返回 Optional.empty()
Optional<String> result = opt
.flatMap(this::findRelated);
if (opt.isPresent()) {
String value = opt.get(); // 不推荐直接用 get()
}
⚠️ 不推荐直接使用 get(),容易又回到 NPE
public Optional<User> findUserById(Long id) {
return Optional.ofNullable(userRepository.getById(id));
}
使用:
findUserById(1L)
.ifPresent(user -> System.out.println(user.getName()));
Optional<User> opt = ...
if (opt.isPresent()) {
User u = opt.get(); // 和写 null 判断没区别
}
❌ 不要用于:
✅ 正确做法:
List<User> users = Collections.emptyList();
Optional 不是用来“替代 null”,而是用来明确“值可能不存在”,并强制你优雅地处理它。
如果你有具体代码场景(比如 JSON、数据库、Stream),我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。