亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

如何使用Java中的Optional

瀏覽:4日期:2022-08-20 11:33:13

NullPointerException是非常常見的異常。由于它,程序往往需要大量使用if-else代碼塊來處理空值,這使得代碼看起來不簡潔 優雅 ,且不方便自己和他人閱讀。本文介紹如何用Optional類來處理null值問題。

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的值為空時,才會執行。

由于由以上差異,我們要根據業務場景謹慎選擇,尤其是涉及服務調用或數據查詢等耗時操作時。

以上就是如何使用Java中的Optional的詳細內容,更多關于Java中的Optional的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 国产成人精品综合在线观看 | xxxxx色 | 思思99精品国产自在现线 | 国产毛片在线看 | 欧美日韩国产在线播放 | 欧美夜恋影院夜恋秀场 | 久久草国产 | 香蕉大久久 | 日韩精品久久不卡中文字幕 | 免费在线看黄色片 | 日本韩国中文字幕毛片 | 国产91免费在线观看 | 天天躁夜夜躁很很躁2020 | 亚洲在线免费观看 | 一级国产在线观看高清 | 欧美日中文字幕 | 91视频免费观看网站 | 中文字幕一区在线观看视频 | 欧美黄色一级在线 | 国产成人精品免费大全 | 1717she精品国产真正免费 | 欧美特级大片 | 天天看天天射天天碰 | 99精品国产自在现线观看 | 黄色免费网址在线观看 | 99久久er热在这里都是精品66 | 成人一级片 | 日韩在线视频免费看 | 国产在线高清一级毛片 | 这里只有精品国产 | 菠萝菠萝蜜在线看7 | 亚洲欧洲日产v特级毛片 | 色老头xxxwww作爱视频 | 久热香蕉精品视频在线播放 | 欧美一级特黄aa大片 | 综合久久精品 | 一级特黄性生活大片免费观看 | 国产96精品 | 国产福利视频在线 | 美女隐私视频黄www免费 | 成人免费网站 |