1. public final class Optional<T> {
  2. }

Optional 类是一个可以为 null 的容器对象。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。
Optional 是个容器:它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

成员变量

  1. /**
  2. * Common instance for {@code empty()}.
  3. */
  4. private static final Optional<?> EMPTY = new Optional<>();
  5. /**
  6. * If non-null, the value; if null, indicates no value is present
  7. */
  8. private final T value;

构造方法

  1. /**
  2. * Constructs an empty instance.
  3. *
  4. * @implNote Generally only one empty instance, {@link Optional#EMPTY},
  5. * should exist per VM.
  6. */
  7. private Optional() {
  8. this.value = null;
  9. }
  10. /**
  11. * Constructs an instance with the value present.
  12. *
  13. * @param value the non-null value to be present
  14. * @throws NullPointerException if value is null
  15. */
  16. private Optional(T value) {
  17. this.value = Objects.requireNonNull(value);
  18. }

成员方法

1. empty()

static <T> Optional<T> empty():返回空的 Optional 实例。

  1. public static<T> Optional<T> empty() {
  2. @SuppressWarnings("unchecked")
  3. Optional<T> t = (Optional<T>) EMPTY;
  4. return t;
  5. }

2. of(T value)

static <T> Optional<T> of(T value):返回一个指定非 null 值的 Optional 实例。

  1. public static <T> Optional<T> of(T value) {
  2. return new Optional<>(value);
  3. }

3. ofNullable(T value)

如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。

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

4. get()

如果在这个 Optional 中包含这个值,返回值,否则抛出异常:NoSuchElementException。
可以配合方法 isPresent() 使用。

  1. public T get() {
  2. if (value == null) {
  3. throw new NoSuchElementException("No value present");
  4. }
  5. return value;
  6. }

5. isPresent()

如果值存在则方法会返回 true,否则返回 false。

  1. public boolean isPresent() {
  2. return value != null;
  3. }

6. ifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

  1. public void ifPresent(Consumer<? super T> consumer) {
  2. if (value != null)
  3. consumer.accept(value);
  4. }

7. filter(Predicate<? super T> predicate)

如果值存在,并且这个值匹配给定的 predicate,返回一个 Optional 用以描述这个值,否则返回一个空的Optional。predicate 为 null 时会抛出 NullPointerException。

  1. public Optional<T> filter(Predicate<? super T> predicate) {
  2. Objects.requireNonNull(predicate);
  3. if (!isPresent())
  4. return this;
  5. else
  6. return predicate.test(value) ? this : empty();
  7. }

8. map(Function<? super T, ? extends U> mapper)

如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的 Optional 作为map 方法返回值,否则返回空 Optional。

  1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
  2. Objects.requireNonNull(mapper);
  3. if (!isPresent())
  4. return empty();
  5. else {
  6. return Optional.ofNullable(mapper.apply(value));
  7. }
  8. }

9. flatMap(Function<? super T, Optional> mapper)

如果值存在,返回基于 Optional 包含的映射方法的值,否则返回一个空的 Optional。

  1. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
  2. Objects.requireNonNull(mapper);
  3. if (!isPresent())
  4. return empty();
  5. else {
  6. return Objects.requireNonNull(mapper.apply(value));
  7. }
  8. }

10. orElse(T other)

如果存在该值,返回值, 否则返回 other。

  1. public T orElse(T other) {
  2. return value != null ? value : other;
  3. }

11. orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

  1. public T orElseGet(Supplier<? extends T> other) {
  2. return value != null ? value : other.get();
  3. }

12. orElseThrow(Supplier<? extends X> exceptionSupplier)

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

  1. public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
  2. if (value != null) {
  3. return value;
  4. } else {
  5. throw exceptionSupplier.get();
  6. }
  7. }