引言
如果问 java coder 编程中见到最多的异常是什么 百分之九十九的程序猿会回答空指针:
java.lang.NullPointerException
根据异常排行榜信息 详细请点击
而空指针异常出现频次竟高出第二名两倍,由此可以断言 只有程序解决了空指针异常那么程序异常崩溃的概率将减少一半。
java8 在工具栏上给我们提供个利器
java.util.Optional<T>
java.util.Optional
其实 java.util.Optional 解决空指针并没有什么神奇之处,只是普通封装的一个工具类 ,并让工具类支持了一下lambda 表达式 将外部判空的操作移动到内部去了
以
ifPresent
方法进行举例 源码如下:
/**
* If a value is present, invoke the specified consumer with the value,
* otherwise do nothing.
*
* @param consumer block to be executed if a value is present
* @throws NullPointerException if value is present and {@code consumer} is
* null
*/
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
其实这与我们自己封装的工具类并无二至,下面介绍一下使用
创建
Optional<T>
类将构造函数进行了私有化 故只能通过3个静态方法创建实例
-
此方法将创建一个空的Optional.empty()
Optional<T>
-
此方法将创建一个泛型为Optional.of(value)
的value
其中Optional<T>
为不可 为value
的如果为null
则会抛出 空指针异常null
-
当不确定Optional.ofNullable(value)
是否为value
时调用 不会抛出异常null
api使用简介
由于返回值在java之后的版本并不兼容 所以这里就不贴返回值了,可以自己进行调用后点进去看返回值,这个类整体都很易懂一看就清楚了
方法 | 参数 | 作用 |
---|---|---|
get | 无 | 获取被包装的对象 如果对象为 则抛出 异常 |
isPresent | 无 | 根据返回 boolean 类型判断是否为 |
ifPresent | Consumer<? super T> | 如果参数不为 则执行传入的方法 |
filter | Predicate<? super T> | 如果传入的方法返回 则返回空的 否则返回自身 |
map | Function<? super T, ? extends U> | 根据传入的方法将当前值转换成其他值并用 进行包装 |
flatMap | Function<? super T, Optional> | 与 仅仅是传入方法的返回值不同 |
orElse | T | 传入一个与其泛型相同的参数,如果 内包装对象为 则返回传入对象 否则返回被包装对象 |
orElseGet | Supplier<? extends T> | 含义与 相同 不同支出在于 传入的是创建好的对象 而此时传入创建过程 |
orElseThrow | Supplier<? extends X> exceptionSupplier | 传入构建一个异常方法,如果被包装对象为 则抛出此异常 |
继承的方法
Optional<T>
继承重新了
equals
和
hashCode
使其直接调用被包装者本身的
equals
和
hashCode
进行比较操作,重写了
toString
方法在其输出外包装了一次
Optional[%s]
的形式