欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用Java中的Optional

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

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

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實例。也許你會覺得它會有點雞肋(我一開始也是這么認為的)。
考慮以下代碼:

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

顯然它會在運行期拋出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ā)中要避免這種糟糕的使用。 下文會介紹相對更好的寫法。

獲取默認值

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有值時返回其值,否則就會執(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ù)場景謹慎選擇,尤其是涉及服務(wù)調(diào)用或數(shù)據(jù)查詢等耗時操作時。

以上就是如何使用Java中的Optional的詳細內(nèi)容,更多關(guān)于Java中的Optional的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis中的Criteria條件查詢方式

    Mybatis中的Criteria條件查詢方式

    這篇文章主要介紹了Mybatis中的Criteria條件查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 基于傳遞list類型的參數(shù)的問題

    基于傳遞list類型的參數(shù)的問題

    這篇文章主要介紹了基于傳遞list類型的參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java14發(fā)布了,再也不怕NullPointerException了

    Java14發(fā)布了,再也不怕NullPointerException了

    這篇文章主要介紹了Java14發(fā)布了,再也不怕NullPointerException了,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-03-03
  • java使用google身份驗證器實現(xiàn)動態(tài)口令驗證的示例

    java使用google身份驗證器實現(xiàn)動態(tài)口令驗證的示例

    本篇文章主要介紹了java使用google身份驗證器實現(xiàn)動態(tài)口令驗證的示例,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • SpringBoot整合aop面向切面編程過程解析

    SpringBoot整合aop面向切面編程過程解析

    這篇文章主要介紹了SpringBoot整合aop面向切面編程過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Spring MVC 啟動過程源碼分析詳解

    Spring MVC 啟動過程源碼分析詳解

    這篇文章主要介紹了Spring MVC 啟動過程源碼分析詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • springboot版本升級以及解決springsecurity漏洞的問題

    springboot版本升級以及解決springsecurity漏洞的問題

    這篇文章主要介紹了springboot版本升級以及解決springsecurity漏洞的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spark JDBC操作MySQL方式詳細講解

    Spark JDBC操作MySQL方式詳細講解

    這篇文章主要介紹了Spark JDBC操作MySQL方式,Spark SQL可以通過JDBC從傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中讀寫數(shù)據(jù),讀取數(shù)據(jù)后直接生成的是DataFrame,然后再加上借助于Spark SQL豐富的API來進行各種操作
    2023-02-02
  • SpringBoot設(shè)置默認主頁的方法步驟

    SpringBoot設(shè)置默認主頁的方法步驟

    這篇文章主要介紹了SpringBoot設(shè)置默認主頁的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 關(guān)于@RequestLine的使用及配置

    關(guān)于@RequestLine的使用及配置

    這篇文章主要介紹了關(guān)于@RequestLine的使用及配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論