Optional 类是 Java 8 才引入的,Optional 是个容器类,它可以保存类型 T 的值,或者仅仅保存null。Optional 提供了很多方法,不用显式进行空值检测,Optional 类的引入很好的解决空指针异常。
1、可以避免出现 NullPointerException 异常。
2、使代码更加健壮,减少出现异常的可能性。
3、提高代码的可读性,使代码更加简洁明了。
4、使代码更加易于维护和理解,因为它能够明确地指定一个值是否可为空。
Optional它的构造函数是私有的,所以我们不能通过 new 来创建 Optional 对象,它提供了三个静态的方法,empty、of 和 ofNullable,通过这三个方法可以获取到一个 Optional 对象。
empty():创建一个包装对象为null的Optional
Optional
of():创建一个包装对象为非null的Optional ,如果为null会报空指针异常
Optional of = Optional.of("helloWord");
ofNullable():创建一个包装对象可能为null的Optional ,如果为null就等价于empty()
Optional
1.get()
获取 Optional 包装的对象,如果包装的对象为 null,会抛出空指针
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
2.isPresent()
判断 Optional 包装的对象是否为 null
public boolean isPresent() {
return value != null;
}
3.isPresent()
判断 Optional 包装的对象是否为 null,如果不为 null,则执行 Consumer 的 accept 方法
public void ifPresent(Consumer super T> consumer) {
if (value != null)
consumer.accept(value);
}
4.ifPresentOrElse()
判断 Optional 包装的对象是否为 null,如果不为 null,则执行 Consumer 的 accept 方法,否则就会执行 Runable 的 run 方法
public void ifPresentOrElse(Consumer super T> action, Runnable emptyAction) {
if (value != null) {
action.accept(value);
} else {
emptyAction.run();
}
}
5.filter()
filter 方法通过 Predicate 判断是否满足条件,如果满足则返回该对象,不满足则返回一个包装 null的 Optional 对象
public Optional filter(Predicate super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
6.map()
map 方法首先判断 Optional 包装的对象是否为 null,如果为 null 则返回一个包装 null 的 Optional对象;否则,通过 Function 的 apply 方法运算,获得一个新值包装成一个新的 Optional 对象并返回
public Optional map(Function super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
7.flatMap()
与 map 方法相似,只是 map 方法接收的 Function 是 Function super T, ? extends U>
而 flatMap 方法接收的 Function 是 Function super T, ? extends Optional extends U>,所以apply方法需要返回一个 Optional 对象
public Optional flatMap(Function super T, Optional> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
可以有效地避免 null 引用异常,但也需要注意不要过度使用 Optional,以免代码变得复杂难以维护