Optional 是個容器:它能夠保存類型T的value,或者僅僅保存null。Optional提供不少有用的方法,這樣咱們就不用顯式進行空值檢測,很好地解決了空指針異常處理的問題,好比可使用isPresent()
方法判斷value是否爲null,使用get()
方法獲取value值等等。html
Optional的構造方法是私有的,實例不能new,可使用靜態方法來建立:java
// 一、建立一個包裝對象值爲空的Optional對象 Optional<String> optStr = Optional.empty(); // 二、建立包裝對象值非空的Optional對象 Optional<String> optStr1 = Optional.of("optional"); // 三、建立包裝對象值容許爲空的Optional對象 Optional<String> optStr2 = Optional.ofNullable(null);
看完Optional的概述,咱們用一個簡單的例子說明一下:git
下面這段代碼接收一個User對象,若是user爲null,則拋出異常【這是一個很是常規的避免空指針異常的作法,若是沒有這步,getName會NPE】,不然返回user的name。github
public String getName1(User user) { if (user == null) { throw new RuntimeException("user不能爲null!"); } return user.getName(); }
若是使用Optional,應該怎麼去處理呢?app
public String getName2(User user) { return Optional.ofNullable(user) // 包裝user對象,若是user爲null,則返回空的Optional對象 .map(User::getName) .orElseThrow(() -> new RuntimeException("user不能爲null"));// 若是有值則返回,沒有則拋出異常。 }
ofNullable
方法將user對象進行包裝,將可能爲null的user對象保護起來。public static <T> Optional<T> ofNullable(T value) { // empty() 方法 建立一個空的Optional對象, of對象在構造Optional的時候,value若是weinull,會引起NPE return value == null ? empty() : of(value); }
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { // 若是有值,直接返回值 if (value != null) { return value; } else { // 拋出異常,這個異常Supplier接口定義 throw exceptionSupplier.get(); } }
方法 | 描述 |
---|---|
empty |
返回一個空的 Optional 實例 |
filter |
若是值存在而且知足提供的斷言, 就返回包含該值的 Optional 對象;不然返回一個空的 Optional 對象 |
map |
若是值存在,就對該值執行提供的 mapping 函數調用 |
flatMap |
若是值存在,就對該值執行提供的 mapping 函數調用,返回一個 Optional 類型的值,不然就返 回一個空的 Optional 對象 |
get |
若是該值存在,將該值用 Optional 封裝返回,不然拋出一個 NoSuchElementException 異常 |
ifPresent |
若是值存在,就執行使用該值的方法調用,不然什麼也不作 |
isPresent |
若是值存在就返回 true,不然返回 false |
of |
將指定值用 Optional 封裝以後返回,若是該值爲 null,則拋出一個 NullPointerException 異常 |
ofNullable |
將指定值用 Optional 封裝以後返回,若是該值爲 null,則返回一個空的 Optional 對象 |
orElse |
若是有值則將其返回,不然返回一個默認值 |
orElseGet |
若是有值則將其返回,不然返回一個由指定的 Supplier 接口生成的值 |
orElseThrow |
若是有值則將其返回,不然拋出一個由指定的 Supplier 接口生成的異常 |