Java8(二)--Optional的使用
目录
一、什么是Optional:
Optional 是 Java 8 引入的容器类(java.util.Optional),用于包装可能为 null 的值。它的核心目标是:
- 明确处理空值:强制开发者显式处理值缺失的情况,减少 NullPointerException。
- 链式调用:支持函数式风格的链式操作,提升代码可读性。
- 替代 null 检查:避免传统的多层 if (obj != null) 嵌套。
二、 创建 Optional:
| 方法 | 描述 | 示例 |
|---|---|---|
| Optional.of(T value) | 创建非空 Optional,若 value 为 null 抛出 NullPointerException | Optional.of("Hello") |
| Optional.ofNullable(T value) | 允许 value 为 null,返回空或非空 Optional | Optional.ofNullable(null) |
| Optional.empty() | 返回一个空的 Optional 实例 | Optional.empty() |
三、常用方法:
1、检查值是否存在:
isPresent():值存在返回 true。
isEmpty()(Java 11+):值不存在返回 true。
Optional<String> opt = Optional.of("Java");
if (opt.isPresent()) {
System.out.println(opt.get()); // 输出 "Java"
}
2、条件执行:
ifPresent(Consumer
):值存在时执行操作。
Optional<String> opt = Optional.of("Java");
opt.ifPresent(val -> System.out.println("Value: " + val)); // 输出 "Value: Java"
3、默认值处理:
orElse(T defaultValue):值不存在时返回默认值。
orElseGet(Supplier<T>):延迟计算默认值(推荐性能敏感场景)。
orElseThrow(Supplier<X>):值不存在时抛出指定异常。
String value = Optional.ofNullable(getNullableValue()).orElse("default");
4、链式转换:
map(Function<T, U>):转换值类型,返回 Optional<U>。
flatMap(Function<T, Optional<U>>):避免嵌套 Optional。
Optional<String> upper = Optional.of("java").map(String::toUpperCase); // Optional["JAVA"]
5、过滤值
filter(Predicate
):满足条件时保留值,否则返回空。
Optional<String> filtered = Optional.of("java").filter(s -> s.length() > 3); // Optional.empty
四、最佳实践:
作为返回值:明确方法可能返回空值。
public Optional<User> findUserById(int id) {
// 可能返回 Optional.empty()
}
避免嵌套 Optional:使用 flatMap 代替多层 map。
优先使用 orElseGet:延迟计算默认值,提升性能。
五、注意事项
不要滥用 Optional:
· 避免作为方法参数或字段(破坏简洁性,且 Optional 不可序列化)。
· 不要替代所有 null 场景,仅用于明确“值可能缺失”的情况。
避免 Optional.get():使用前必须检查存在性,否则抛出 NoSuchElementException。
性能开销:频繁创建 Optional 对象可能影响性能(需权衡可读性与效率)。
六、示例对比:
1、传统方式:
User user = getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
System.out.println(address.getCity());
}
}
2、使用 Optional:
Optional.ofNullable(getUser())
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(System.out::println);
Optional.ofNullable(response)
.map(anotherResponse::getUserList)
.map(list -> list.getFirst())
.orElseThrow(() -> throw new RuntimeException("message"));
if(Optional.ofNullable(id).orElse(0) > 0) {
};
Optional<UserTypeEnum> secondOptional = Arrays.stream(UserTypeEnum.values()).filter(x -> x.eqStatus(status)).findFirst();
return secondOptional.orElse(null);
七、总结:
Optional 是处理 null 的现代化工具,通过显式管理空值,提升代码健壮性和可读性。正确使用时需遵循“明确意图、避免滥用”的原则,结合链式调用和默认值处理,减少空指针异常风险。

浙公网安备 33010602011771号