Optional类的使用

Optional类的使用

基本使用

Optional 类提供了几种静态方法来创建 Optional 实例:

  • Optional.empty():创建一个空的 Optional 实例。
  • Optional.of(T value):创建一个包含非空值的 Optional 实例。
  • Optional.ofNullable(T value):如果传入的值不为 null,则创建一个包含该值的 Optional 实例;如果为 null,则创建一个空的 Optional 实例。

常用方法

  • isPresent():如果 Optional 包含非空值,则返回 true
  • ifPresent(Consumer<? super T> consumer):如果 Optional 包含非空值,则对该值执行给定的操作。
  • get():如果 Optional 包含值,则返回该值;否则抛出 NoSuchElementException
  • orElse(T other):如果 Optional 包含值,则返回该值;否则返回提供的其他值。
  • orElseGet(Supplier<? extends T> other):如果 Optional 包含值,则返回该值;否则返回由 Supplier 回调函数提供的值。
  • orElseThrow():如果 Optional 包含值,则返回该值;否则抛出 NullPointerException 或由 Supplier 回调函数提供的异常。
  • map(Function<? super T,? extends U> mapper):如果 Optional 包含值,则将值应用到提供的函数上,并返回一个新的 Optional 实例;如果为空,则返回空的 Optional
  • flatMap(Function<? super T, Optional<U>> mapper):与 map 类似,但是 mapper 返回的是一个 Optional,这允许链式调用。

示例代码

// 创建一个包含值的 Optional
Optional<String> optional = Optional.of("Hello, World!");

// 创建一个空的 Optional
Optional<String> empty = Optional.empty();

// 使用 isPresent 检查值是否存在
if (optional.isPresent()) {
    System.out.println("Value is present: " + optional.get());
}

// 使用 ifPresent 执行操作
optional.ifPresent(System.out::println);

// 使用 orElse 提供默认值
String value = optional.orElse("Default Value");

// 使用 orElseGet 获取由 Supplier 提供的值
value = optional.orElseGet(() -> "Value from Supplier");

// 使用 map 转换值
Optional<Integer> length = optional.map(String::length);

// 使用 flatMap 链式转换
Optional<Integer> maybeLength = Optional.ofNullable(null)
    .flatMap(s -> Optional.of(s.length()));

使用场景

Optional 类非常适合用于方法返回类型,这些方法可能返回 null。通过返回 Optional,可以避免调用者直接处理 null 值,而是通过 Optional 提供的方法来安全地访问值。

注意事项

  • 不要使用 Optional 作为字段类型或参数类型,因为这会隐藏 null 值的存在。
  • 避免在 Optional 中包装基本类型,因为 Optional 只能包装对象类型。
  • 使用 Optional 时,应避免调用 get(),因为它可能会抛出异常。使用 orElseorElseGet 可以更安全地处理空值。

Optional 类是一个强大的工具,可以帮助开发者以更安全的方式处理可能为空的值,减少 NullPointerException 的风险。

posted @ 2024-08-14 15:59  wen-210162704027  阅读(1)  评论(0编辑  收藏  举报