Java8之Optional類

寫在前頭

今天再看阿里的Java開發手冊,裏面異常處理第10條提到這樣一個建議。程序員

【推薦】防止 NPE ,是程序員的基本修養,注意 NPE 產生的場景:
1 ) 返回類型爲基本數據類型,return 包裝數據類型的對象時,自動拆箱有可能產生 NPE。
反例: public int f() { return Integer 對象}, 若是爲 null ,自動解箱拋 NPE 。
2 ) 數據庫的查詢結果可能爲 null 。
3 ) 集合裏的元素即便 isNotEmpty ,取出的數據元素也可能爲 null 。
4 ) 遠程調用返回對象時,一概要求進行空指針判斷,防止 NPE 。
5 ) 對於 Session 中獲取的數據,建議 NPE 檢查,避免空指針。
6 ) 級聯調用 obj . getA() . getB() . getC(); 一連串調用,易產生 NPE 。
正例:使用 JDK8 的 Optional 類來防止 NPE 問題。數據庫

裏面的正確示例提示咱們用Java8的Optional類來防止NPE的問題。app

那咱們今天就看看這個Optional類吧函數

 

Optional類

  • 類方法

序號 方法 & 描述
1 static <T> Optional<T> empty()

返回空的 Optional 實例。ui

2 boolean equals(Object obj)

判斷其餘對象是否等於 Optional。spa

3 Optional<T> filter(Predicate<? super <T> predicate)

若是值存在,而且這個值匹配給定的 predicate,返回一個Optional用以描述這個值,不然返回一個空的Optional。指針

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

若是值存在,返回基於Optional包含的映射方法的值,不然返回一個空的Optional調試

5 T get()

若是在這個Optional中包含這個值,返回值,不然拋出異常:NoSuchElementExceptioncode

6 int hashCode()

返回存在值的哈希碼,若是值不存在 返回 0。對象

7 void ifPresent(Consumer<? super T> consumer)

若是值存在則使用該值調用 consumer , 不然不作任何事情。

8 boolean isPresent()

若是值存在則方法會返回true,不然返回 false。

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

若是有值,則對其執行調用映射函數獲得返回值。若是返回值不爲 null,則建立包含映射返回值的Optional做爲map方法返回值,不然返回空Optional。

10 static <T> Optional<T> of(T value)

返回一個指定非null值的Optional。

11 static <T> Optional<T> ofNullable(T value)

若是爲非空,返回 Optional 描述的指定值,不然返回空的 Optional。

12 T orElse(T other)

若是存在該值,返回值, 不然返回 other。

13 T orElseGet(Supplier<? extends T> other)

若是存在該值,返回值, 不然觸發 other,並返回 other 調用的結果。

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

 

若是存在該值,返回包含的值,不然拋出由 Supplier 繼承的異常

15 String toString()

返回一個Optional的非空字符串,用來調試

 

咱們能夠看到Optional總共也就10+個方法,其中有三個static方法。而且Optional的構造方法是private,不能new出來。

因此咱們通常用這三個static來獲取Optional的對象。

 

  •  of && ofNullable

1 public static <T> Optional<T> of(T value) {
2     return new Optional<>(value);
3 }
4 
5 public static <T> Optional<T> ofNullable(T value) {
6     return value == null ? empty() : of(value);
7 }

很明顯 of 對null對象沒有作任何處理,ofNullable才作了處理。因此當咱們不知道傳入的對象是否爲null的時候,咱們應該選擇用 ofNullable來作處理。

  • map 

1 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
2     Objects.requireNonNull(mapper);
3     if (!isPresent())
4         return empty();
5     else {
6         return Optional.ofNullable(mapper.apply(value));
7     }
8 }

若是咱們想獲取Object裏面的值的話,咱們就須要用到這個map。

 

例子

 1 public class OptionalTest {
 2     public static void main(String[] args) {
 3         Person person = new Person("zhangsan", 18);
 4         String name = getName(person);
 5         System.out.println(name);
 6     }
 7 
 8     private static String getName(Person person) {
 9         if (Objects.isNull(person)) {
10             return "unKnown";
11         }
12         return person.getName();
13     }
14 
15 }

咱們看上面的這個例子。

咱們有一個函數 getName 做用是獲取Person對象的名字。但我並不知道這個Person是否爲Null。

因此我要進行一個判斷,判斷Person是否爲空,在作決定。

但若是咱們使用Optional類的話,咱們能夠這樣寫

 1 public class OptionalTest {
 2     public static void main(String[] args) {
 3         Person person = new Person("zhangsan", 18);
 4         String name = getName(person);
 5         System.out.println(name);
 6     }
 7 
 8     private static String getName(Person person) {
 9         String name = Optional.ofNullable(person).map(x -> x.getName())
10                 .orElse("unKnown");
11         return name;
12     }
13 }

若是傳入的爲空,它會自動new一個  Optional<T> t = (Optional<T>) EMPTY; 

有效的處理到了null的問題,並且還很是的簡潔。

相關文章
相關標籤/搜索