Optional

Optional 是 Java 8 提供的为了解决 null 安全问题的一个 API。 提供了多种方法来处理可能为 null 的值,从而减少空指针异常的风险。

使用 Optional,我们可以把下面的代码进行改写。

public static String getName(User user) {
  if(user ==null || user.name == null) {
    return "Unknown";
  }
  return user.name;
}
// 🅱️ Bad
public static String getName(User user) {
  Optional<User> userOptional = Optional.ofNullable(user);
  if(!user.isPresent()) {
    return "Unknown";
  }
  return user.get().getName();
}

// ✅ Good
public static String getName(User user) {
  return Optional.ofNullable(user).map(User::getName).orElse("Unknown");
}

构造 Optional 的三种方式

public static<T> Optional<T> empty() {
  Optional<T> t = (Optional<T>) EMPTY;
  return t;
}

public static <T> Optional<T> of(T value) {
  return new Optional<>(value);
}

public static <T> Optional<T> ofNullable(T value) {
  return value == null ? empty() : of(value);
}

常用 API

ifPresent()

如果存在值,则执行指定的操作。

Optional<String> optional = Optional.of("Hello");
optional.ifPresent(value -> System.out.println(value)); // 输出: Hello

map()

map 方法能够返回另外一个 Optional 对象。

Optional<String> optional = Optional.of("Hello");
Optional<Integer> length = optional.map(String::length);
System.out.println(length.get()); // 输出: 5

orElse()

如果存在指,返回指定的值,反之返回默认值。

Optional<String> optional = Optional.empty();
String result = optional.orElse("Default Value");
System.out.println(result); // 输出: Default Value

orElseGet()

如果存在指,返回指定的值,调用 other 并返回该调用结果。

Optional<String> optional = Optional.empty();
String result = optional.orElseGet(() -> "Generated Value");
System.out.println(result); // 输出: Generated Value

orElseThrow()

如果存在指,返回指定的值,反之抛出指定的异常。

Optional<String> optional = Optional.empty();
try {
  optional.orElseThrow(() -> new IllegalArgumentException("Value is absent"));
} catch (IllegalArgumentException e) {
  System.out.println(e.getMessage()); // 输出: Value is absent
}

最后更新于

这有帮助吗?