温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Optional 是什么

发布时间:2026-09-19 06:50:21 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

在 Java 中,Optional 是 Java 8 引入的一个容器类,位于 java.util 包下,用来表示一个值可能存在,也可能不存在,主要用于避免 NullPointerException(空指针异常)。


一、为什么需要 Optional?

在 Java 8 之前,经常会出现这样的代码:

String name = user.getAddress().getCity().getName();

如果 user、address 或 city 任意一个为 null,就会抛 NullPointerException。

Optional 的初衷是:

显式地表达“可能没有值”,强迫调用者处理空值情况


二、Optional 是什么?

Optional<T> 本质是一个容器:

  • 里面 可能包含 一个非 null 值
  • 也可能 什么都没有(empty)
Optional<String> opt = Optional.of("hello");
Optional<String> empty = Optional.empty();

三、常见创建方式

// 1. 一定非 null 的值
Optional<String> opt1 = Optional.of("abc");

// 2. 可能为 null 的值
Optional<String> opt2 = Optional.ofNullable(null); // 不会抛异常

// 3. 空 Optional
Optional<String> opt3 = Optional.empty();

⚠️ Optional.of(null) 会直接抛 NullPointerException


四、常用方法(重点)

1️⃣ 判断是否有值

if (opt.isPresent()) {
    System.out.println(opt.get());
}

2️⃣ 更安全的方式(推荐)

opt.ifPresent(value -> System.out.println(value));

3️⃣ 获取值(有风险)

String s = opt.get(); // 如果没有值,会抛 NoSuchElementException

❌ 不推荐直接 get()


4️⃣ 提供默认值(最常用)

String s = opt.orElse("default");
String s2 = opt.orElseGet(() -> "default");

区别:

  • orElse:无论如何都会执行
  • orElseGet:只有为空时才执行(性能更好)

5️⃣ 为空抛异常

String s = opt.orElseThrow(() -> new RuntimeException("值不存在"));

6️⃣ 链式处理(很像 Stream)

Optional<User> userOpt = ...;

String city = userOpt
    .map(User::getAddress)
    .map(Address::getCity)
    .orElse("未知城市");

✅ 有效避免多层 null 判断


7️⃣ 过滤

opt.filter(s -> s.length() > 3)
   .ifPresent(System.out::println);

五、Optional 的使用场景

✅ 适合:

  • 方法返回值(可能无结果)
  • 避免 null 判断嵌套
  • 提高代码可读性

❌ 不适合:

  • 作为类字段
  • 作为方法参数
  • 在集合中使用 Optional

六、典型示例对比

传统写法

public String getCity(User user) {
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            City city = address.getCity();
            if (city != null) {
                return city.getName();
            }
        }
    }
    return "未知";
}

Optional 写法

public String getCity(User user) {
    return Optional.ofNullable(user)
        .map(User::getAddress)
        .map(Address::getCity)
        .map(City::getName)
        .orElse("未知");
}

七、一句话总结

Optional 不是用来消灭 null,而是用来“明确表达和处理可能不存在的值”。

如果你愿意,我也可以讲:

  • Optional 和 Stream 的区别
  • Optional 在 Spring / JPA 中的用法
  • Optional 常见误用场景
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手