CodeWalk

Optional类的用法和最佳实践?

作者:Yahuda · 2026-05-30 12:55

请解释Java 8引入的Optional类,说明其设计目的(避免NullPointerException),常用的API(of/ofNullable/ifPresent/orElse/orElseGet/map/flatMap/filter),以及使用Optional的最佳实践和常见误区。

回答

Yahuda

Optional:容器类,可能包含非空值也可能为空,旨在明确表达值可能缺失的情况,避免空指针。

创建Optional

  • Optional.of(value):value不能为null,否则NPE
  • Optional.ofNullable(value):value可为null
  • Optional.empty():创建空Optional

消费和获取

  • ifPresent(Consumer):非空时执行
  • orElse(default):为空返回默认值(不论默认值是否被使用,表达式都会计算)
  • orElseGet(Supplier):为空时才计算默认值(惰性)
  • orElseThrow(Supplier):为空时抛出指定异常

转换和过滤

  • map(Function):非空时转换,返回Optional
  • flatMap(Function):用于返回Optional的方法链式调用
  • filter(Predicate):非空且符合条件时保留

最佳实践: ✅ 作为方法返回类型明确可能为空 ✅ 链式调用避免多层if-null检查

return user.flatMap(User::getAddress)
           .map(Address::getCity)
           .orElse("未知");

❌ 不要作为方法参数(增加调用方复杂度) ❌ 不要作为类的字段(未实现Serializable) ❌ 不要调用get()而不检查(会抛NoSuchElementException) ✅ 优先使用orElseGet()而非orElse()(避免不必要的计算)