Java 8 引入的 Optional 類型,基本是把它當作 null 值優雅的處理方式。其實也不完全如此,Optional 在語義上更能體現有還是沒有值。所以它不是設計來作爲 null 的替代品,如果方法返回 null 值表達了二義性,沒有結果或是執行中出現異常。
在 Oracle 做 Java 語言工作的 Brian Goetz 在 Stack Overflow 回覆 Should Java 8 getters return optional type? 中講述了引入 Optional 的主要動機。
Our intention was to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result”, and using null for such was overwhelmingly likely to cause errors.
說的是 Optional 提供了一個有限的機制讓類庫方法返回值清晰的表達有與沒有值,避免很多時候 null 造成的錯誤。並非有了 Optional 就要完全杜絕 NullPointerException。
在 Java 8 之前一個實踐是方法返回集合或數組時,應返回空集合或數組表示沒有元素; 而對於返回對象,只能用 null 來表示不存在,現在可以用 Optional 來表示這個意義。
自 Java8 於 2014-03-18 發佈後已 5 年有餘,這裏就列舉幾個我們在項目實踐中使用 Optional 常見的幾個用法。
Optional 類型作爲字段或方法參數
這兒把 Optional 類型用爲字段(類或實例變量)和方法參數放在一起來講,是因爲假如我們使用 IntelliJ IDEA 來寫 Java 8 代碼,IDEA 對於 Optional 作爲字段和方法參數會給出同樣的代碼建議: 閱讀全文 >>