温馨提示×

温馨提示×

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

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

怎样使用 java Optional 取值

发布时间:2026-09-19 07:04:44 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

在 Java 中,Optional<T> 是用来避免 NullPointerException 的容器类,表示一个值可能存在,也可能为空。
重点:使用 Optional 不是为了“强制取值”,而是为了安全、清晰地处理“可能为空”的情况。

下面按常见场景说明如何使用 Optional 取值。


一、创建 Optional

Optional<String> opt1 = Optional.of("hello");      // 值不能为 null
Optional<String> opt2 = Optional.ofNullable(null); // 可以为 null
Optional<String> opt3 = Optional.empty();          // 空 Optional

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


二、最不推荐的方式:直接取值(慎用)

String value = opt.get(); // 如果为空,抛 NoSuchElementException

✅ 不推荐在业务代码中直接使用 get()


三、推荐的安全取值方式

1️⃣ orElse(值为空时给默认值)

String value = opt.orElse("default");

✅ 值存在就用,不存在用默认值
✅ 默认值每次都会创建


2️⃣ orElseGet(懒加载默认值)

String value = opt.orElseGet(() -> "default");

✅ 只有值为空时才执行 lambda
✅ 性能更好(尤其是默认值创建成本高时)


3️⃣ orElseThrow(值为空就抛异常)

String value = opt.orElseThrow(() -> new RuntimeException("值不能为空"));

✅ 明确表达“这个值必须存在”


四、有值才做事情(避免 if null)

1️⃣ ifPresent

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

2️⃣ ifPresentOrElse(Java 9+)

opt.ifPresentOrElse(
    value -> System.out.println(value),
    () -> System.out.println("值为空")
);

五、转换 / 链式处理(非常常用)

1️⃣ map

Optional<Integer> len = opt.map(String::length);

2️⃣ flatMap(返回 Optional)

Optional<String> result = opt.flatMap(s -> Optional.of(s.toUpperCase()));

3️⃣ filter

Optional<String> filtered = opt.filter(s -> s.length() > 3);

六、完整示例

public String getName(User user) {
    return Optional.ofNullable(user)
            .map(User::getName)
            .filter(name -> !name.isBlank())
            .orElse("匿名用户");
}

七、使用 Optional 的建议 ⚠️

✅ 适合:

  • 方法返回值(表示“可能没有结果”)
  • 流式处理(Stream + Optional)

❌ 不适合:

  • 类的字段(不要用 Optional<String> name)
  • 方法参数(不要用 Optional 作为参数)
  • 序列化对象

如果你愿意,可以告诉我:

  • 你用的是 Java 8 还是更新版本
  • 是 Stream 中使用 还是 普通业务代码

我可以直接给你最合适的写法。

向AI问一下细节

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

AI
助
手