在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,可以显著降低因空指针异常导致的程序错误,提升代码的可读性和健壮性。