Optional
是 Java 8 引入的一个容器类,用于处理可能为空(null
)的值。它旨在减少 NullPointerException
(空指针异常)的发生,并提供一种更具表现力和安全的方式来处理可选值。
Optional
的基本概念
Optional<T>
:Optional
是一个泛型类,可以包含类型为T
的值,或者为空。- 非空值:
Optional
可以包含一个非空值。 - 空值:
Optional
可以是“空”的,表示不包含任何值。
创建 Optional
实例
-
Optional.of(T value)
:创建一个包含非空值的Optional
。如果传入的值为null
,会抛出NullPointerException
。Optional<String> optional = Optional.of("Hello");
-
Optional.ofNullable(T value)
:创建一个可能为空的Optional
。如果传入的值为null
,则返回一个空的Optional
。Optional<String> optional = Optional.ofNullable(null);
-
Optional.empty()
:创建一个空的Optional
。Optional<String> emptyOptional = Optional.empty();
访问 Optional
中的值
-
isPresent()
:检查Optional
中是否有值。if (optional.isPresent()) { System.out.println("Value is present"); }
-
ifPresent(Consumer<? super T> action)
:如果Optional
中有值,执行给定的操作。optional.ifPresent(value -> System.out.println("Value: " + value));
-
get()
:获取Optional
中的值,如果为空会抛出NoSuchElementException
。String value = optional.get();
-
orElse(T other)
:如果Optional
中有值,则返回该值,否则返回other
。String value = optional.orElse("Default Value");
-
orElseGet(Supplier<? extends T> other)
:与orElse
类似,但other
是一个函数,当Optional
为空时才会执行。String value = optional.orElseGet(() -> "Default Value from Supplier");
-
orElseThrow(Supplier<? extends X> exceptionSupplier)
:如果Optional
中有值,则返回该值,否则抛出由exceptionSupplier
提供的异常。String value = optional.orElseThrow(() -> new IllegalArgumentException("No value present"));
示例
示例 1:避免 NullPointerException
public class OptionalExample {
public static void main(String[] args) {
String value = null;
Optional<String> optionalValue = Optional.ofNullable(value);
// 如果有值,打印值;否则打印默认值
System.out.println(optionalValue.orElse("Default Value"));
}
}
示例 2:链式操作
public class OptionalExample {
public static void main(String[] args) {
Optional<String> optional = Optional.of("Java");
optional.map(String::toUpperCase)
.filter(s -> s.startsWith("J"))
.ifPresent(System.out::println); // Output: JAVA
}
}
在这个例子中,Optional
中的值经过 map
转换、filter
过滤,最后通过 ifPresent
打印输出。
使用场景
- 方法返回值:当方法可能返回
null
时,可以使用Optional
包装返回值。 - 处理可能为
null
的对象:在需要处理可能为null
的对象时,使用Optional
可以提供更安全的处理方式。
注意事项
- 不应滥用:
Optional
是为了解决可能为空的值而设计的,不应该用于所有返回值。 - 不能用于集合类型:不要将
Optional
用于集合类型的返回值,如Optional<List<T>>
,这种用法通常不推荐。
Optional
提供了一种更加简洁和安全的方式来处理可能为空的值,是现代 Java 编程中非常有用的工具。