Java 8 中的 Optional 类

2025年4月23日 | 7 分钟阅读

Java 在 JDK 8 版本 中引入了一个新的类 Optional。它是一个公共的 final 类,用于处理 Java 应用程序中的 NullPointerException。我们必须导入 java.util 包才能使用这个类。它提供了用于检查特定变量是否有值存在的方法。

Java Optional 类方法

方法描述
public static <T> Optional<T> empty()它返回一个空的 Optional 对象。此 Optional 对象不存在值。
public static <T> Optional<T> of(T value)它返回一个包含指定存在的非 null 值的 Optional 对象。
public static <T> Optional<T> ofNullable(T value)它返回一个描述指定值的 Optional 对象,如果该值非 null,否则返回一个空的 Optional 对象。
public T get()如果此 Optional 对象中存在值,则返回该值;否则,抛出 NoSuchElementException。
public boolean isPresent()如果存在值,则返回 true,否则返回 false。
public void ifPresent(Consumer<? super T> consumer)如果存在值,则调用指定的消费者来处理该值,否则什么也不做。
public Optional<T> filter(Predicate<? super T> predicate)如果存在值,并且该值与给定的谓词匹配,则返回一个描述该值的 Optional 对象;否则,返回一个空的 Optional 对象。
public <U> Optional<U> map(Function<? super T,? extends U> mapper)如果存在值,则将其应用到提供的映射函数,如果结果非 null,则返回一个描述该结果的 Optional 对象。否则,返回一个空的 Optional 对象。
public <U> Optional<U> flatMap(Function<? super T,Optional<U> mapper)如果存在值,则将其应用到提供的产生 Optional 的映射函数,返回该结果,否则返回一个空的 Optional 对象。
public T orElse(T other)如果存在值,则返回该值;否则,返回 other。
public T orElseGet(Supplier<? extends T> other)如果存在值,则返回该值;否则,调用 other 并返回该调用的结果。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable如果存在值,则返回包含的值;否则,抛出一个由提供的供应商创建的异常。
public boolean equals(Object obj)指示另一个对象是否“等于”此 Optional 对象。当满足以下条件时,另一个对象被视为相等:
  • 它也是一个 Optional 对象,并且;
  • 两个实例都没有值,或者;
  • 存在的值通过 equals() 方法“相等”。
public int hashCode()如果存在值,则返回该值的哈希码;如果不存在值,则返回 0。
public String toString()返回此 Optional 的非空字符串表示形式,适用于调试。确切的表示格式未指定,并且可能因实现和版本而异。

示例:不使用 Optional 的 Java 程序

在以下示例中,我们没有使用 Optional 类。程序将异常终止并抛出 NullPointerException。

文件名:OptionalExample.java

输出

Exception in thread "main" java.lang.NullPointerException
	at lambdaExample.OptionalExample.main(OptionalExample.java:6)

为了避免异常终止,我们使用了 Optional 类。在以下示例中,我们使用了 Optional。因此,我们的程序可以正常执行而不会崩溃。

Java Optional 示例:值不存在时

文件名:OptionalExample.java

输出

string value is not present

Java Optional 示例:值存在时

文件名:OptionalExample.java

输出

java optional class example

另一个 Java Optional 示例

输出

JAVA OPTIONAL CLASS EXAMPLE
JAVA OPTIONAL CLASS EXAMPLE
java optional class example

Java Optional 方法示例

文件名:OptionalExample.java

输出

Optional.empty
Filtered value: Optional.empty
Filtered value: Optional[JAVA OPTIONAL CLASS EXAMPLE]
Getting value: JAVA OPTIONAL CLASS EXAMPLE
Getting hashCode: -619947648
Is value present: true
Nullable Optional: Optional[JAVA OPTIONAL CLASS EXAMPLE]
orElse: JAVA OPTIONAL CLASS EXAMPLE
orElse: Value is not present
JAVA OPTIONAL CLASS EXAMPLE

当值不存在时使用备用值:orElse() 和 orElseGet()

Java 的 Optional 类中的 orElse()orElseGet() 方法用于在 Optional 对象中包含的值不存在时检索该值。它们的目的相似,但在操作方式上略有不同。下面我们通过一个 Java 程序来看看这两个方法的用法。

文件名:OptionalOrElseExample.java

输出

Name with orElse: Default User
Computing default username...
Name with orElseGet: Computed Default User

使用 map() 和 flatMap() 转换 Optional 值

使用 map() 方法

map() 方法将一个函数应用于 Optional 中的值(如果存在)。然后,它将结果包装在一个新的 Optional 中。这对于在值保留在 Optional 容器内的同时转换值很有用。

文件名:OptionalFilterExample.java

输出

JOHN DOE

使用 flatMap() 方法

flatMap() 方法将一个函数应用于 Optional 中的值,并且该函数必须返回一个 Optional。这对于避免嵌套的 Optional(例如 Optional<Optional<T>>)结构很有用,而是得到一个扁平的 Optional<T> 结构。

文件名:OptionalFlatMapExample.java

输出

Name length: 8

使用 filter() 方法有条件地返回值

Java 的 Optional 类中的 filter() 方法提供了一种根据谓词有条件地返回值的方法。如果 Optional 中存在一个值并且它与谓词匹配,则按原样返回 Optional;如果该值不匹配谓词,则返回一个空的 Optional。此方法对于在 Optional 操作链中应用条件逻辑而无需显式 null 检查或条件语句很有用。

filter() 方法的基本用法

这是一个示例,演示了如何使用 filter() 来检查包含值上的条件。我们将创建一个场景,检查用户名为“admin”并根据该检查执行操作。

文件名:OptionalFilterExample.java

输出

User is an admin

下一主题Deepseek