Optional类的使用
目录基本使用
Optional
类提供了几种静态方法来创建 Optional
实例:
Optional.empty()
:创建一个空的Optional
实例。Optional.of(T value)
:创建一个包含非空值的Optional
实例。Optional.ofNullable(T value)
:如果传入的值不为null
,则创建一个包含该值的Optional
实例;如果为null
,则创建一个空的Optional
实例。
常用方法
isPresent()
:如果Optional
包含非空值,则返回true
。ifPresent(Consumer<? super T> consumer)
:如果Optional
包含非空值,则对该值执行给定的操作。get()
:如果Optional
包含值,则返回该值;否则抛出NoSuchElementException
。orElse(T other)
:如果Optional
包含值,则返回该值;否则返回提供的其他值。orElseGet(Supplier<? extends T> other)
:如果Optional
包含值,则返回该值;否则返回由Supplier
回调函数提供的值。orElseThrow()
:如果Optional
包含值,则返回该值;否则抛出NullPointerException
或由Supplier
回调函数提供的异常。map(Function<? super T,? extends U> mapper)
:如果Optional
包含值,则将值应用到提供的函数上,并返回一个新的Optional
实例;如果为空,则返回空的Optional
。flatMap(Function<? super T, Optional<U>> mapper)
:与map
类似,但是mapper
返回的是一个Optional
,这允许链式调用。
示例代码
// 创建一个包含值的 Optional
Optional<String> optional = Optional.of("Hello, World!");
// 创建一个空的 Optional
Optional<String> empty = Optional.empty();
// 使用 isPresent 检查值是否存在
if (optional.isPresent()) {
System.out.println("Value is present: " + optional.get());
}
// 使用 ifPresent 执行操作
optional.ifPresent(System.out::println);
// 使用 orElse 提供默认值
String value = optional.orElse("Default Value");
// 使用 orElseGet 获取由 Supplier 提供的值
value = optional.orElseGet(() -> "Value from Supplier");
// 使用 map 转换值
Optional<Integer> length = optional.map(String::length);
// 使用 flatMap 链式转换
Optional<Integer> maybeLength = Optional.ofNullable(null)
.flatMap(s -> Optional.of(s.length()));
使用场景
Optional
类非常适合用于方法返回类型,这些方法可能返回 null
。通过返回 Optional
,可以避免调用者直接处理 null
值,而是通过 Optional
提供的方法来安全地访问值。
注意事项
- 不要使用
Optional
作为字段类型或参数类型,因为这会隐藏null
值的存在。 - 避免在
Optional
中包装基本类型,因为Optional
只能包装对象类型。 - 使用
Optional
时,应避免调用get()
,因为它可能会抛出异常。使用orElse
或orElseGet
可以更安全地处理空值。
Optional
类是一个强大的工具,可以帮助开发者以更安全的方式处理可能为空的值,减少 NullPointerException
的风险。