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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何使用Java中的Optional

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

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

Optional類

先來(lái)看一段代碼:

String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();

這段代碼在任何一個(gè)方法調(diào)用時(shí),都有可能拋出NullPointerException。而通常我們的處理方式是不斷地利用if代碼塊來(lái)確保上一步的值不為空并執(zhí)行下一步代碼。

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值判斷問(wèn)題,借鑒google guava類庫(kù)的Optional類而引入的一個(gè)同名Optional類,使用Optional類可以避免顯式的null值判斷(null的防御性檢查),避免null導(dǎo)致的NPE(NullPointerException)。

如何創(chuàng)建Optional實(shí)例

Optional類沒(méi)有公共構(gòu)造函數(shù)。 但是確提供了三個(gè)靜態(tài)方法在不同情形下根據(jù)需求創(chuàng)建Optional實(shí)例。

Optional.of()

這個(gè)方法要求你傳入一個(gè)不為空的值(不一定是引用類型,也可以是原始類型),所以下面這種寫法還是會(huì)拋出一個(gè)NullPointerException異常:

Optional.of(null);

可見(jiàn)Optional并不能完全避免NullPointerException,關(guān)鍵在于你是否正確以及規(guī)范地使用它。但大多數(shù)情況下,我們使用Optional正是由于無(wú)法確定值是否為空。在這種情況下,我們使用下面這個(gè)方法。

Optional.ofNullable()

這個(gè)方法允許你傳入空值或者非空值。

Optional.empty()

這個(gè)方法會(huì)返回一個(gè)包裝空值的Optional實(shí)例。也許你會(huì)覺(jué)得它會(huì)有點(diǎn)雞肋(我一開(kāi)始也是這么認(rèn)為的)。考慮以下代碼:

int dividend = 10, divisor = 0;int result = dividend / divisor;Optional<Integer> o = Optional.of(result);

顯然它會(huì)在運(yùn)行期拋出ArithmeticException異常,這使得后續(xù)對(duì)于o的可能存在的操作因異常而終止。

改寫如下:

int dividend = 10, divisor = 0;Optional<Integer> o;try { int result = dividend / divisor; o = Optional.of(result);} catch (ArithmeticException e) { o = Optional.empty();}

訪問(wèn)Optional實(shí)例的值get()

它的源碼:

public T get() { if (value == null) { throw new NoSuchElementException('No value present'); } return value;}

當(dāng)Optional實(shí)例包裝的是一個(gè)空值時(shí),它會(huì)拋出NoSuchElementException。

所以在調(diào)用get()方法前我們還是需要判斷Optional是否包裝空值。使用ifPresent()方法來(lái)判斷其包裝的是否是空值:

public static String getGender(Student student) { Optional<Student> stuOpt = Optional.ofNullable(student); if(stuOpt.isPresent()) { return stuOpt.get().getGender(); } return 'Unkown'; }

而這其實(shí)是一種很糟糕的寫法,因?yàn)檫@種用法不但沒(méi)有減少null的防御性檢查,而且增加了Optional包裝的過(guò)程,違背了Optional設(shè)計(jì)的初衷,因此開(kāi)發(fā)中要避免這種糟糕的使用。 下文會(huì)介紹相對(duì)更好的寫法。

獲取默認(rèn)值

Optional提供了兩種方法來(lái)返回默認(rèn)值。

orElse()

orElse()會(huì)在Optional有值時(shí)返回它的值,否則就會(huì)返回傳入的默認(rèn)值。

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()則稍有不同,它會(huì)在Optional有值時(shí)返回其值,否則就會(huì)執(zhí)行作為參數(shù)傳入的Supplier實(shí)例的get()方法,并返回其執(zhí)行結(jié)果。

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的,也就是說(shuō)無(wú)論Optional的值是否為空,它都會(huì)執(zhí)行。 orElseGet()是LAZY的,只有當(dāng)Optional的值為空時(shí),才會(huì)執(zhí)行。

由于由以上差異,我們要根據(jù)業(yè)務(wù)場(chǎng)景謹(jǐn)慎選擇,尤其是涉及服務(wù)調(diào)用或數(shù)據(jù)查詢等耗時(shí)操作時(shí)。

以上就是如何使用Java中的Optional的詳細(xì)內(nèi)容,更多關(guān)于Java中的Optional的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本免费乱人伦在线观看 | 国产原创视频在线 | 91久久精品 | 亚洲国产成人在线 | 午夜激情免费视频 | 国产国产人在线成免费视频69 | 国产欧美日韩综合精品一区二区 | 中文一级毛片 | 国产精品亚洲综合天堂夜夜 | 99久久精品国产一区二区成人 | 高清女女同性一区二区 | 韩国免费特一级毛片 | 777成了人精品视频 777色淫网站女女 | 国产乱码一区二区三区四川人 | 三级黄色一级视频 | 2021久久精品99精品久久 | 国产欧美日韩综合一区二区三区 | 欧美视频在线看 | 色一情一区二区三区四区 | 亚洲精品99久久久久久欧美版 | 成人视品| 丁香婷婷开心激情深爱五月 | 亚洲精品小说一区二区三区 | 欧美日韩国产亚洲综合不卡 | 亚洲免费一区 | 五月激激激综合网色播免费 | 亚洲大成色www永久网址 | 国产中出视频 | 免费观看欧美成人1314色 | 日韩高清不卡在线 | 高清欧美日韩一区二区三区在线观看 | 亚洲午夜精品一区二区蜜桃 | 狠狠色丁香久久综合五月 | 国产五月婷婷 | 亚洲免费三级 | 香蕉高清免费永久在线视频 | 亚洲天堂h | 国内精品久久久久影院6 | 国产乱码精品一区二区 | aaa毛片在线 | 99久久精品国产片 |