### Optional
一个容器类,代表一个值存在或者不存在。用来避免空指针的异常。
java8对Optional的描述这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
### Optional 的三种构造方式:
#### 1. Optional.of(obj)
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException。
#### 2. Optional.ofNullable(obj)
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。(ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况.)
**源码**
```java传 null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj).
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
```
#### 3. Optional.empty()
创建一个空的Optional
### 其他的方法
#### 1.get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
```java
//执行下面的代码会输出:No value present
try {
//在空的Optional实例上调用get(),抛出NoSuchElementException
System.out.println(empty.get());
} catch (NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
```
#### 2.ifPresent
如果Optional实例是否有值
有=true 无=false
#### 3.orElse
如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。
#### 4.orElseGet
orElseGet方法可以接受Supplier接口的实现用来生成默认值。
empty.orElseGet(() -> "Default Value")
#### 5.orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
```java
try {
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
//输出: No value present in the Optional instance
System.out.println(ex.getMessage());
}
```
#### 6.map
如果有值,则对其执行调用map函数得到返回值。如果返回值不为null,则创建包含map返回值的Optional作为map方法返回值,否则返回空Optional。
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())
#### 7.flatMap
与Map类似,但要求返回的必须是Optional。
optional.flatMap(t->Optional.of(t.length()));
* * * * *
使用方式:可能又有可能没有的值包装到Optional里面即可。
private Optional<Man> man = Optional.empty();