最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Java中的Optional

 更新時(shí)間:2020年11月30日 10:03:04   作者:West2ers'' Blog  
這篇文章主要介紹了如何使用Java中的Optional,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

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è)不為空的值(不一定是引用類型,也可以是原始類型),
所以下面這種寫(xiě)法還是會(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的可能存在的操作因異常而終止。

改寫(xiě)如下:

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

獲取默認(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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 數(shù)據(jù)類型及類型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼

    Java 數(shù)據(jù)類型及類型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼

    這篇文章主要介紹了Java 數(shù)據(jù)類型及類型轉(zhuǎn)換的互相轉(zhuǎn)換實(shí)例代碼,需要的朋友可以參考下
    2020-10-10
  • Java操作集合工具類Collections使用詳解

    Java操作集合工具類Collections使用詳解

    這篇文章主要介紹了java操作集合工具類Collections使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java中InputStream轉(zhuǎn)為MultipartFile的解決方案

    java中InputStream轉(zhuǎn)為MultipartFile的解決方案

    這篇文章主要介紹了java中InputStream轉(zhuǎn)為MultipartFile的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • IDEA 端口占用的解決方法(推薦)

    IDEA 端口占用的解決方法(推薦)

    這篇文章主要介紹了IDEA 端口占用的解決方法,本文通過(guò)兩種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Spring Cloud Gateway內(nèi)置的斷言和過(guò)濾器作用說(shuō)明

    Spring Cloud Gateway內(nèi)置的斷言和過(guò)濾器作用說(shuō)明

    這篇文章主要介紹了Spring Cloud Gateway內(nèi)置的斷言和過(guò)濾器作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java 如何優(yōu)雅的拋出業(yè)務(wù)異常

    Java 如何優(yōu)雅的拋出業(yè)務(wù)異常

    這篇文章主要介紹了Java 如何優(yōu)雅的拋出業(yè)務(wù)異常,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳解SpringBoot的Run方法

    詳解SpringBoot的Run方法

    本文給大家介紹了SpringBoot的Run方法,文中通過(guò)實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-10-10
  • MAC下基于maven使用IDEA走讀TestNG源碼解析

    MAC下基于maven使用IDEA走讀TestNG源碼解析

    這篇文章主要介紹了MAC下基于maven使用IDEA走讀TestNG源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-06-06
  • Java中BitMap(位圖)hutool版、IntMap、LongMap示例詳解

    Java中BitMap(位圖)hutool版、IntMap、LongMap示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中BitMap(位圖)hutool版、IntMap、LongMap的相關(guān)資料,通過(guò)位運(yùn)算高效存儲(chǔ)和檢索整數(shù),相比于傳統(tǒng)數(shù)組,它們?cè)趦?nèi)存占用和性能上都有顯著優(yōu)勢(shì),需要的朋友可以參考下
    2024-12-12

最新評(píng)論

蛟河市| 依安县| 左云县| 枣阳市| 康平县| 齐河县| 海门市| 克山县| 石楼县| 庆阳市| 金门县| 石首市| 姚安县| 恭城| 双牌县| 施甸县| 乌鲁木齐县| 越西县| 伊吾县| 墨竹工卡县| 齐齐哈尔市| 泽普县| 建阳市| 翼城县| 会东县| 通河县| 枣庄市| 黄骅市| 镇原县| 新沂市| 陵水| 宿州市| 板桥市| 益阳市| 清徐县| 荔波县| 鄱阳县| 阜宁县| 通海县| 嘉定区| 安顺市|