Optional类的用法和最佳实践?
请解释Java 8引入的Optional类,说明其设计目的(避免NullPointerException),常用的API(of/ofNullable/ifPresent/orElse/orElseGet/map/flatMap/filter),以及使用Optional的最佳实践和常见误区。
回答
Yahuda
Optional:容器类,可能包含非空值也可能为空,旨在明确表达值可能缺失的情况,避免空指针。
创建Optional:
Optional.of(value):value不能为null,否则NPEOptional.ofNullable(value):value可为nullOptional.empty():创建空Optional
消费和获取:
ifPresent(Consumer):非空时执行orElse(default):为空返回默认值(不论默认值是否被使用,表达式都会计算)orElseGet(Supplier):为空时才计算默认值(惰性)orElseThrow(Supplier):为空时抛出指定异常
转换和过滤:
map(Function):非空时转换,返回OptionalflatMap(Function):用于返回Optional的方法链式调用filter(Predicate):非空且符合条件时保留
最佳实践: ✅ 作为方法返回类型明确可能为空 ✅ 链式调用避免多层if-null检查
return user.flatMap(User::getAddress)
.map(Address::getCity)
.orElse("未知");
❌ 不要作为方法参数(增加调用方复杂度) ❌ 不要作为类的字段(未实现Serializable) ❌ 不要调用get()而不检查(会抛NoSuchElementException) ✅ 优先使用orElseGet()而非orElse()(避免不必要的计算)