Optional<T> 是 Java 8 引入的一个容器类,用来解决 null 引用的问题。它可以包含或不包含一个非空值。Optional 主要用于避免 NullPointerException,使代码更加安全和可读。
创建 Optional 对象
有几种方式可以创建一个 Optional 对象:
1. Optional.of(T value)
这个方法用于创建包含非空值的 Optional 对象。如果传入的值为 null,它会抛出 NullPointerException。
|
|
2. Optional.ofNullable(T value)
这个方法允许传入一个可能为 null 的值。如果值为 null,它会返回一个空的 Optional 对象;否则返回一个包含该值的 Optional。
|
|
3. Optional.empty()
创建一个空的 Optional 对象,不包含任何值。
|
|
使用 Optional 的常用方法
1. isPresent()
检查 Optional 是否包含值。如果值存在,返回 true,否则返回 false。
|
|
2. ifPresent(Consumer<? super T> action)
如果 Optional 中包含值,就执行给定的 Consumer 操作,否则不执行。
|
|
3. orElse(T other)
如果 Optional 中包含值,返回该值;如果为空,则返回一个默认值。
|
|
4. orElseGet(Supplier<? extends T> other)
类似于 orElse(),但可以通过传递 Supplier 来动态生成默认值。
|
|
5. orElseThrow(Supplier<? extends X> exceptionSupplier)
如果 Optional 中包含值,返回该值;如果为空,抛出自定义的异常。
|
|
6. get()
返回 Optional 中包含的值。如果为空,则抛出 NoSuchElementException。
|
|
注意:使用 get() 之前应当确保 Optional 中有值,可以配合 isPresent() 或者 ifPresent() 来避免异常。
7. map(Function<? super T,? extends U> mapper)
如果 Optional 中存在值,则对其应用 Function 并返回新的 Optional,否则返回空的 Optional。
|
|
8. flatMap(Function<? super T, Optional<U>> mapper)
与 map() 类似,但 mapper 返回的是一个 Optional,而不是直接返回值,用于嵌套的 Optional 解包。
|
|
示例
|
|
总结
Optional 是一个非常有用的工具,可以有效避免 null 引用问题,增强代码的可读性和健壮性。通过合理使用 Optional 的各种方法,你可以更好地管理代码中的空值处理逻辑。