您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Optional如何在Java項目中使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Optional類
先來看一段代碼:
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
這段代碼在任何一個方法調用時,都有可能拋出NullPointerException
。
而通常我們的處理方式是不斷地利用if代碼塊來確保上一步的值不為空并執行下一步代碼。
if (user != null) { Address address = user.getAddress(); if (address != null) { Country country = address.getCountry(); if (country != null) { String isocode = country.getIsocode(); if (isocode != null) { isocode = isocode.toUpperCase(); } } } }
嗯,一股切割器cutter的味道。
Optional類是Java8為了解決null值判斷問題,借鑒google guava類庫的Optional類而引入的一個同名Optional類,使用Optional類可以避免顯式的null值判斷(null的防御性檢查),避免null導致的NPE(NullPointerException)。
如何創建Optional實例
Optional類沒有公共構造函數。 但是確提供了三個靜態方法在不同情形下根據需求創建Optional實例。
Optional.of()
這個方法要求你傳入一個不為空的值(不一定是引用類型,也可以是原始類型),
所以下面這種寫法還是會拋出一個NullPointerException異常:
Optional.of(null);
可見Optional并不能完全避免NullPointerException,關鍵在于你是否正確以及規范地使用它。
但大多數情況下,我們使用Optional正是由于無法確定值是否為空。在這種情況下,我們使用下面這個方法。
Optional.ofNullable()
這個方法允許你傳入空值或者非空值。
Optional.empty()
這個方法會返回一個包裝空值的Optional實例。也許你會覺得它會有點雞肋(我一開始也是這么認為的)。
考慮以下代碼:
int dividend = 10, divisor = 0; int result = dividend / divisor; Optional<Integer> o = Optional.of(result);
顯然它會在運行期拋出ArithmeticException異常,這使得后續對于o的可能存在的操作因異常而終止。
改寫如下:
int dividend = 10, divisor = 0; Optional<Integer> o; try { int result = dividend / divisor; o = Optional.of(result); } catch (ArithmeticException e) { o = Optional.empty(); }
訪問Optional實例的值
get()
它的源碼:
public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; }
當Optional實例包裝的是一個空值時,它會拋出NoSuchElementException。
所以在調用get()方法前我們還是需要判斷Optional是否包裝空值。
使用ifPresent()方法來判斷其包裝的是否是空值:
public static String getGender(Student student) { Optional<Student> stuOpt = Optional.ofNullable(student); if(stuOpt.isPresent()) { return stuOpt.get().getGender(); } return "Unkown"; }
而這其實是一種很糟糕的寫法,因為這種用法不但沒有減少null的防御性檢查,而且增加了Optional包裝的過程,違背了Optional設計的初衷,因此開發中要避免這種糟糕的使用。 下文會介紹相對更好的寫法。
獲取默認值
Optional提供了兩種方法來返回默認值。
orElse()
orElse()會在Optional有值時返回它的值,否則就會返回傳入的默認值。
public class Main { public static void main(String[] args) { System.out.println(getGender(null)); } public static String getGender(Student student) { Student stuOpt = Optional.ofNullable(student).orElse(new Student(); return stuOpt.getGender(); } }
orElseGet()
orElseGet()則稍有不同,它會在Optional有值時返回其值,否則就會執行作為參數傳入的Supplier實例的get()方法,并返回其執行結果。
public class Main { public static void main(String[] args) { System.out.println(getGender(null)); } public static String getGender(Student student) { Student stuOpt = Optional.ofNullable(student).orElseGet(Student::new); return stuOpt.getGender(); } }
兩者的不同之處
orElse()是EAGER的,也就是說無論Optional的值是否為空,它都會執行。
orElseGet()是LAZY的,只有當Optional的值為空時,才會執行。
由于由以上差異,我們要根據業務場景謹慎選擇,尤其是涉及服務調用或數據查詢等耗時操作時。
以上就是Optional如何在Java項目中使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。