合理使用Optional可避免空指针异常,提升代码安全性和可读性。1. 用Optional.ofNullable封装可能为null的对象,如用户为空时姓名设为“未知用户”;2. 通过orElse提供默认值,高开销场景优先使用延迟加载的orElseGet;3. 利用map链式转换嵌套属性,自动规避中间null值;4. 避免直接调用get(),应结合ifPresent等方法进行安全操作。核心是将判空转为流程控制,但不宜滥用作字段或集合元素。

Java的Optional是一种容器类,用来封装可能为null的对象,避免直接调用null对象导致空指针异常。合理使用Optional可以让代码更清晰、安全。
1. 使用Optional.ofNullable处理可能为null的值
当不确定一个对象是否为null时,可以用Optional.ofNullable()来包装它。如果值为null,会返回一个空的Optional对象,不会抛出异常。
- 示例:获取用户姓名,但用户可能为空
- 这样即使user为null,也不会抛出NullPointerException,name会被设为“未知用户”
String name = Optional.ofNullable(user)
.map(User::getName)
立即学习“Java免费学习笔记(深入)”;
.orElse("未知用户");
2. 使用orElse和orElseGet提供默认值
当Optional中没有值时,可以指定一个默认返回值。
- orElse(T other):直接返回传入的默认值,无论是否有值
- orElseGet(Supplier extends T> supplier):只有在值不存在时才调用Supplier生成值,适合开销较大的默认值创建
- 建议:如果默认值创建成本高,优先使用orElseGet()
3. 使用map和flatMap转换Optional中的值
避免链式调用中出现null,比如user.getAddress().getCity()这种容易出错的写法。
- 用map()安全地提取嵌套属性
- 每一层map都会自动检查上一步结果是否为null,是则跳过后续map,最终返回空Optional
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
4. 避免Optional.get()直接调用
get()方法在Optional为空时会抛出NoSuchElementException,失去使用Optional的意义。
- 不要这样写:if (opt.isPresent()) opt.get();
- 应改用orElse()、ifPresent()或map()等组合方法
- 如需执行操作:opt.ifPresent(user -> System.out.println(user.getName()));
基本上就这些。用好Optional的核心是把“判空逻辑”转化为“流程控制”,让代码更简洁且不易出错。注意别滥用,比如不推荐用Optional作为类字段或集合元素。










