### 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();