在 Java 中,Optional<T> 是用来避免 NullPointerException 的容器类,表示一个值可能存在,也可能为空。
重点:使用 Optional 不是为了“强制取值”,而是为了安全、清晰地处理“可能为空”的情况。
下面按常见场景说明如何使用 Optional 取值。
Optional<String> opt1 = Optional.of("hello"); // 值不能为 null
Optional<String> opt2 = Optional.ofNullable(null); // 可以为 null
Optional<String> opt3 = Optional.empty(); // 空 Optional
⚠️ Optional.of(null) 会直接抛 NullPointerException
String value = opt.get(); // 如果为空,抛 NoSuchElementException
✅ 不推荐在业务代码中直接使用 get()
orElse(值为空时给默认值)String value = opt.orElse("default");
✅ 值存在就用,不存在用默认值
✅ 默认值每次都会创建
orElseGet(懒加载默认值)String value = opt.orElseGet(() -> "default");
✅ 只有值为空时才执行 lambda
✅ 性能更好(尤其是默认值创建成本高时)
orElseThrow(值为空就抛异常)String value = opt.orElseThrow(() -> new RuntimeException("值不能为空"));
✅ 明确表达“这个值必须存在”
ifPresentopt.ifPresent(value -> System.out.println(value));
ifPresentOrElse(Java 9+)opt.ifPresentOrElse(
value -> System.out.println(value),
() -> System.out.println("值为空")
);
mapOptional<Integer> len = opt.map(String::length);
flatMap(返回 Optional)Optional<String> result = opt.flatMap(s -> Optional.of(s.toUpperCase()));
filterOptional<String> filtered = opt.filter(s -> s.length() > 3);
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.filter(name -> !name.isBlank())
.orElse("匿名用户");
}
✅ 适合:
❌ 不适合:
Optional<String> name)Optional 作为参数)如果你愿意,可以告诉我:
我可以直接给你最合适的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。