探索Java Optional类:构造器、成员变量与方法

发布于:2024-04-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

在Java 8中,为了应对空指针异常(NullPointerException)这一常见的编程问题,引入了java.util.Optional类。它提供了一种优雅的方式来表示可能为null的值,并通过一系列丰富的方法来处理这些值。本文将详细介绍Optional类的构造器、成员变量以及主要方法。

构造器

Optional.empty()

public static <T> Optional<T> empty()

这是一个静态工厂方法,用于创建一个不包含任何值的Optional实例。当需要表示一个不存在或缺失的值时,可以使用此方法。

Optional.of(T value)

public static <T> Optional<T> of(T value)

该静态工厂方法接收一个非null参数value,并返回一个包含该值的Optional实例。如果传入的value为null,则会抛出NullPointerException

Optional.ofNullable(T value)

public static <T> Optional<T> ofNullable(T value)

Optional.of()相似,此方法也用于创建一个Optional实例。不同之处在于,ofNullable()允许传入null值,此时返回的Optional实例将是空的(即调用isPresent()会返回false)。

成员变量

Optional类没有公开的成员变量。其内部实现通常包含一个泛型类型的值引用,但对使用者而言是不可见的。

方法

get()

public T get()

如果Optional实例包含值(即isPresent()返回true),则返回该值;否则抛出NoSuchElementException

isPresent()

public boolean isPresent()

判断Optional实例是否包含值。若包含值,返回true;否则返回false。

ifPresent(Consumer<? super T> consumer)

public void ifPresent(Consumer<? super T> consumer)

如果Optional实例包含值,执行给定的consumer消费函数,将值传递给该函数进行处理。若Optional为空,则不做任何操作。

filter(Predicate<? super T> predicate)

public Optional<T> filter(Predicate<? super T> predicate)

对Optional实例包含的值应用给定的predicate断言。如果断言结果为true,则返回包含原值的Optional;否则返回一个空Optional。

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

public <U> Optional<U> map(Function<? super T, ? extends U> mapper)

对Optional实例包含的值应用给定的mapper函数,将原值转换为新类型U。如果原Optional为空,返回一个空的Optional;否则返回一个新的Optional实例,其中包含经过映射函数处理后的值。

flatMap(Function<? super T, ? extends Optional<? extends U>> mapper)

public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper)

类似于map()方法,但接受的mapper函数返回的是一个Optional。如果原Optional为空,返回一个空的Optional;否则,应用mapper函数并将返回的Optional直接返回。这样可以避免连续的Optional嵌套。

orElse(T other)

public T orElse(T other)

如果Optional实例包含值,返回该值;否则返回指定的other值。

orElseGet(Supplier<? extends T> other)

public T orElseGet(Supplier<? extends T> other)

如果Optional实例包含值,返回该值;否则调用给定的other供应者函数获取并返回一个值。

orElseThrow(Supplier<? extends X> exceptionSupplier)

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果Optional实例包含值,返回该值;否则抛出自exceptionSupplier提供的异常。

equals(Object obj), hashCode() & toString()

Optional类实现了equals(), hashCode()toString()方法,以支持其作为键值存储在集合中,以及在调试时提供有意义的字符串表示。

  • equals():比较两个Optional实例是否相等,只有当它们都为空或者包含相同的非null值时才相等。
  • hashCode():根据Optional实例的状态(空或包含的值)生成哈希码。
  • toString():返回描述Optional实例状态(空或包含的值)的字符串。

Optional.EMPTY

Optional类提供了一个静态final字段EMPTY,它是Optional类型的实例,且不包含任何值。可以直接使用Optional.EMPTY代替Optional.empty()来创建一个空的Optional。

Optional<String> emptyOpt = Optional.EMPTY;

总结

Java Optional类通过构造器、成员变量及丰富的操作方法,为处理可能为null的值提供了安全、简洁的解决方案。合理运用Optional,可以显著降低因空指针异常导致的程序错误,提升代码的可读性和健壮性。