Java8(二)--Optional的使用

一、什么是Optional:

Optional 是 Java 8 引入的容器类(java.util.Optional),用于包装可能为 null 的值。它的核心目标是:

  1. 明确处理空值:强制开发者显式处理值缺失的情况,减少 NullPointerException。
  2. 链式调用:支持函数式风格的链式操作,提升代码可读性。
  3. 替代 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 的现代化工具,通过显式管理空值,提升代码健壮性和可读性。正确使用时需遵循“明确意图、避免滥用”的原则,结合链式调用和默认值处理,减少空指针异常风险。

posted @ 2025-04-10 21:01  Diamond-Shine  阅读(355)  评论(0)    收藏  举报