Java Optional 学习与使用
前言
最近在使用SpringBoot data JPA相关接口的时候发现,许多接口的返回类型都从传统的泛型<T>
转化为了Optional<T>
,而且我们所常用的List等也用了迭代器Iterable
进行代替,其中原因是很值得我们去深究的,使用了此类接口有何优势,为何要替代,此类接口的实现方法等
类的方法
从jdk源码中我们可以很快速找到Optional
的相关方法:
方法 | 描述 |
---|---|
empty() | 返回空的 Optional 实例。 |
of(T) | 返回一个指定非null值的Optional。 |
ofNullable(T) | 如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
get() | 返回包含的对象 |
isPresent() | 如果值存在则方法会返回true,否则返回 false。 |
isEmpty() | 判空 |
ifPresent(Consumer<? super T> action) | 如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) | ifPresentOrElse 方法的改进就是有了 else,接受两个参数 Consumer 和 Runnable.ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即 action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse 还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用 emptyAction,即 emptyAction.run()。 |
filter(Predicate<? super T> predicate) | 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) | 如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
or(Supplier<? extends Optional<? extends T>> supplier) | |
Stream stream() | stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的 Stream,否则返回一个空的 Stream(Stream.empty())。 |
orElse(T other) | 如果值存在,返回 Optional 指定的值,否则返回一个预设的值。 |
orElseGet(Supplier<? extends T> supplier) | 如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
orElseThrow(Supplier<? extends X> exceptionSupplier) | 如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
equals(Object obj) | 判等 |
hashCode() | 返回存在值的哈希码,如果值不存在 返回 0。 |
toString() |
首先我们看看这个Optional
的介绍:
A container object which may or may not contain a non-{@code null} value. If a value is present, {@code isPresent()} returns {@code true}. If no value is present, the object is considered <i>empty</i> and {@code isPresent()} returns {@code false}.
翻译过来,Optional
类就是一个允许object为空的容器,提供了isPresent
来判断是否为空。
PS:jdk源码屎山名不虚传,翻都不知道怎么翻,不如直接看实战吧!
实际中的使用
简单的创建Optionnal
实例
import java.util.Optional;
public class Java8Tester {
public static void main(String args[]){
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException<