Skip to main content

Optional 的用法

使用 Optional 的目的

  • 防御式编程判空
  • 避免多层嵌套 if xx == null 检查

使用示例

不用 Optional 的嵌套示例

public static void checkEmpty(Scenic scenic) {
if (scenic == null) {
throw new RuntimeException("数据错误");
}
if (scenic.getCity() == null) {
throw new RuntimeException("数据错误");
}
if (scenic.getCity().getCountry() == null) {
throw new RuntimeException("数据错误");
}
if (scenic.getCity().getCountry().getContinent() == null) {
throw new RuntimeException("数据错误");
}
if (scenic.getCity().getCountry().getContinent().getName() == null
|| scenic.getCity().getCountry().getContinent().getName().isBlank()) {
throw new RuntimeException("数据错误");
}
}

使用 Optional 的嵌套示例

public static void checkEmptyByOptional(Scenic scenic) {
Optional.ofNullable(scenic)
.map(Scenic::getCity)
.map(City::getCountry)
.map(Country::getContinent)
.map(Continent::getName)
.filter(name -> !name.isBlank())
.orElseThrow(() -> new RuntimeException("数据错误"));
}

map() 方法的工作原理

  • map() 方法的作用是从一个 Optional<T> 的值中提取一个新值,这个新值是通过函数转换得到的。

例如,假设 Optional<Scenic> 的值是 scenic,map(Scenic::getCity) 会调用 scenic.getCity(),并将结果包装成一个新的 Optional<City>

Optional 详细用法

1、创建 Optional 对象

  • 创建一个空的 Optional 实例

    Optional<String> emptyOptional = Optional.empty();
  • 创建一个包含非 null 值的 Optional

    Optional<String> optional = Optional.of("Hello");
  • 创建一个可能为 null 的值的 Optional

    Optional<String> nullableOptional = Optional.ofNullable(null);

2、检查值是否存在

  • isPresent()

  • isEmpty()

3、获取值

  • get()

    • 如果 Optional 包含值,则返回值,否则抛出 NoSuchElementException
  • orElse(T other)

    • 如果 Optional 包含值,则返回值,否则返回默认值
  • orElseGet

    • 如果 Optional 包含值,则返回值,否则调用传入的函数获取返回值
    String value = optional.orElseGet(() -> "Generated Default");
  • orElseThrow

    • 如果 Optional 包含值,则返回值,否则抛出自定义异常。

4、操作和转换

  • ifPresent

    • 如果 Optional 包含值,则执行指定的操作
    optional.ifPresent(System.out::println);
  • ifPresentOrElse

    • 如果 Optional 包含值,则执行指定的操作,否则执行空操作。
    optional.ifPresentOrElse(System.out::println, () -> System.out.println("No value present"));
  • map

    • 返回 Optional(函数返回值)
    Optional<Integer> length = optional.map(Scenic::getCity);
  • flatMap

    • 返回 函数值,这个返回值必须是 Optional 类型
    Optional<String> result = optional.flatMap(s -> Optional.of(s.toUpperCase()));
  • filter

    • 如果值存在且满足条件,则返回包含该值的 Optional,否则返回空。
    Optional<String> filtered = optional.filter(s -> s.length() > 5);
  • or

    • 如果当前 Optional 为空,则通过函数生成一个新的 Optional
    Optional<String> combined = optional.or(() -> Optional.of("Alternative"));