Optional类
Class Optional
Optional 类主要解决的问题是空指针异常(NullPointerException)
Optional实际上是个容器类:它可以保存类型T的值表示这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常。
- java.util.Optional
- 在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
String code = user.getAddress().getCountry().getcode().toUpperCase();
如果确保不触发异常,就得在访问每一个值之前对其进行明确地检查:
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String code = country.getcode();
if (code != null) {
code = code.toUpperCase();
}
}
}
}
这很容易就变得冗长,难以维护。
一、方法摘要
序号 | 方法 & 描述 |
---|---|
1 | **static Optional empty() **返回空的 Optional 实例。 |
2 | boolean equals(Object obj) 判断其他对象是否等于 Optional。 |
3 | **Optional filter(Predicate<? super predicate) **如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。 |
4 | ** Optional flatMap(Function<? super T,Optional> mapper) **如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional |
5 | **T get() **如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException |
6 | int hashCode() 返回存在值的哈希码,如果值不存在 返回 0。 |
7 | void ifPresent(Consumer<? super T> consumer) 如果值存在则使用该值调用 consumer , 否则不做任何事情。 |
8 | **boolean isPresent() **如果值存在则方法会返回true,否则返回 false。 |
9 | **Optional map(Function<? super T,? extends U> mapper) ** 如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。 |
10 | **static Optional of(T value) **返回一个指定非null值的Optional。 |
11 | **static Optional ofNullable(T value) **如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。 |
12 | T orElse(T other) 如果存在该值,返回值, 否则返回 other。 |
13 | T orElseGet(Supplier<? extends T> other) 如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。 |
14 | ** T orElseThrow(Supplier<? extends X> exceptionSupplier) **如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常 |
15 | **String toString() **返回一个Optional的非空字符串,用来调试 |
二、Optional的创建
Optional不提供公共构造函数,所以必须采用工厂的方法加以实例化。可以通过静态的工厂方法:Optional.of()、 **Optional.ofNullable()**或者 **Optional.empty()**方法来创建Optional
1.Optional.empty():创建空对象
示例:
Optional<String> optStr = Optional.empty();
上面的示例代码调用empty()
方法创建了一个空的Optional<String>
对象型。
源码:
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
private static final Optional<?> EMPTY = new Optional<>();
2.Optional.of(T t):创建对象:不允许为空
Optional提供了方法of()
用于创建非空对象,该方法要求传入的参数不能为空,否则抛NullPointException
,示例如下:
Optional<String> optStr = Optional.of(str); // 当str为null的时候,将抛出NullPointException
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cpOkVN5C-1604498109587)(C:\Users\xiaoyuya\AppData\Roaming\Typora\typora-user-images\1560238751082.png)]
注意:当使用 Optional 提供的静态方法 of 创建 Optional 对象时,方法的参数不能null,否则,方法会抛出 NullPointerException
源码:
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
3.Optional.ofNulllable(T t):创建对象:允许为空
如果不能确定传入的参数是否存在null值的可能性,则可以用Optional的ofNullable()
方法创建对象,如果入参为null,则创建一个空对象。示例如下:
Optional<String> optStr = Optional.ofNullable(str); // 如果str是null,则创建一个空对象
源码:
public static