成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Optional如何在Java項目中使用-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)Optional如何在Java項目中使用,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出楚雄州免費做網(wǎng)站回饋大家。

Optional類


先來看一段代碼:

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

這段代碼在任何一個方法調(diào)用時,都有可能拋出NullPointerException
而通常我們的處理方式是不斷地利用if代碼塊來確保上一步的值不為空并執(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值判斷問題,借鑒google guava類庫的Optional類而引入的一個同名Optional類,使用Optional類可以避免顯式的null值判斷(null的防御性檢查),避免null導(dǎo)致的NPE(NullPointerException)。

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

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

Optional.of()

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

Optional.of(null);

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

Optional.ofNullable()

這個方法允許你傳入空值或者非空值。

Optional.empty()

這個方法會返回一個包裝空值的Optional實例。也許你會覺得它會有點雞肋(我一開始也是這么認(rèn)為的)。
考慮以下代碼:

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

顯然它會在運(yùn)行期拋出ArithmeticException異常,這使得后續(xù)對于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;
}

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

所以在調(diào)用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設(shè)計的初衷,因此開發(fā)中要避免這種糟糕的使用。 下文會介紹相對更好的寫法。

獲取默認(rèn)值

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

orElse()

orElse()會在Optional有值時返回它的值,否則就會返回傳入的默認(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()則稍有不同,它會在Optional有值時返回其值,否則就會執(zhí)行作為參數(shù)傳入的Supplier實例的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的,也就是說無論Optional的值是否為空,它都會執(zhí)行。

  • orElseGet()是LAZY的,只有當(dāng)Optional的值為空時,才會執(zhí)行。


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

以上就是Optional如何在Java項目中使用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:Optional如何在Java項目中使用-創(chuàng)新互聯(lián)
文章分享:http://jinyejixie.com/article30/dijdso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)、電子商務(wù)營銷型網(wǎng)站建設(shè)、App設(shè)計、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
砚山县| 大英县| 北票市| 盘山县| 桃园县| 万安县| 宝丰县| 黎川县| 黑山县| 原平市| 银川市| 綦江县| 蓝山县| 青浦区| 墨玉县| 沅陵县| 凌海市| 陆丰市| 阿尔山市| 额尔古纳市| 大厂| 泰和县| 西昌市| 太仆寺旗| 城固县| 白山市| 德阳市| 九龙城区| 阳朔县| 冕宁县| 镇雄县| 宁蒗| 社会| 阳曲县| 榆树市| 阿巴嘎旗| 南汇区| 扎兰屯市| 洪泽县| 锦州市| 华亭县|