關(guān)于optional的orElse和orElseGet、orElseThrow

前言:

  • Optional是java8中增加的API,可以很好的解決空指針異常,而不用我們來進行顯式的空值檢測。

    • 比如說Optional可以是一個為null的容器。Optional.ofNullable(null)
    • isPresent方法當(dāng)值存在時返回true,調(diào)用get()方法返回其對象
  • 粗看Java8中的APIOptional中的方法,獲取Optional中的值用get()方法就可以了,那么和orElse()orElseGet()的獲取值的方法有什么不同呢?

  • 當(dāng)我們在IDEA中使用get()時,IDEA會高亮提示,此方法需要先用isPresent()進行判斷,然后再調(diào)用get()方法

  • 以前沒有推出Optional時,我們的代碼是這樣的

    User user = .....
     
    if (user != null) {
     
    return user.getOrders();
     
    } else {
     
    return Collections.emptyList();
     
    }
    
    

    而有了Optional后代碼如果寫成下面這樣,其實并沒有多大區(qū)別

    Optional<User> user = ......
     
    if (user.isPresent()) {
     
    return user.getOrders();
     
    } else {
     
    return Collections.emptyList();
     
    }
    
    
  • 那么我們?nèi)绻_使用Optional的獲取值的方法呢?

    就要提到orElseorElseGet

用法

orElse

如果Optional實例有值則將其返回,否則返回orElse方法傳入的參數(shù)

public T orElse(T other)
  • 參數(shù):other,即需要被返回的值

  • 返回:當(dāng)只存在時返回值,不存在返回other(可以理解為自定義值,如字符串的內(nèi)容)

  • 例子:

    //調(diào)用工廠方法創(chuàng)建Optional實例
    Optional<String> name = Optional.of("Dolores");
    //創(chuàng)建一個空實例
    Optional empty = Optional.ofNullable(null);
    //創(chuàng)建一個不允許值為空的空實例
    Optional noEmpty = Optional.of(null);
    
    //如果值不為null,orElse方法返回Optional實例的值。
    //如果為null,返回傳入的消息。
    //輸出:Dolores
    System.out.println(name.orElse("There is some value!"));
    //輸出:There is no value present!
    System.out.println(empty.orElse("There is no value present!"));
    //拋NullPointerException
    System.out.println(noEmpty.orElse("There is no 
    value present!");
    
orElseGet

orElseGetorElse方法類似,區(qū)別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier的實現(xiàn)用來生成默認值

public T orElseGet(Supplier<? extends T> other)
  • 參數(shù):繼承Supplier接口的other,當(dāng)值為null的時候返回

  • 返回:值存在返回值,值不存在返回other

  • 異常:當(dāng)不允許值為空的情況(例如)下值為空時或other無效拋NullPointerException

  • 例子:

    //orElseGet與orElse方法類似,區(qū)別在于orElse傳入的是默認值,
    //orElseGet可以接受一個lambda表達式生成默認值。
    //輸出:Dolores
    System.out.println(name.orElseGet(() -> ``"it's value"``));
    //輸出:No value
    System.out.println(empty.orElseGet(() -> ``"No value"``));
    //拋出NullPointerException
    System.out.println(noEmpty.orElseGet(() -> ``"it's value"``));
    
orElseThrow

如果有值則將其返回,否則拋出Supplier接口創(chuàng)建的異常。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                    throws X extends Throwable
  • 參數(shù):exceptionSupplier 一個拋異常的實例化Supplier
  • 返回:當(dāng)前值或當(dāng)值為null拋出異常
  • 異常:當(dāng)不允許值為空的時候以及exceptionSupplier為空拋NullPointerException;值為空拋Supplier繼承的異常
  • 例子:
try {
  //orElseThrow與orElse方法類似。與返回默認值不同,
  //orElseThrow會拋出lambda表達式或方法生成的異常 
  empty.orElseThrow(DemoException::new);
} catch (Throwable throwable) {
  //輸出: Here is message
  System.out.println(throwable.toString());
} 
try {
  o.orElseThrow(DemoException::new);
} catch (Throwable throwable) {
  //輸出:Exception in thread "main" java.lang.NullPointerException的詳細信息
  System.out.println(throwable.printStackTrace());
}
   

以下是自定義的DemoException

class DemoException extends Throwable {
 
  public DemoException() {
    super();
  }
 
  public DemoException(String msg) {
    super(msg);
  }
 
  @Override
  public String getMessage() {
    return "Here is message";
  }
}

總結(jié)

總的來說,orElseorElseGet方法差不多,兩者都會返回定義的內(nèi)容,前者是字符串,后者是實現(xiàn)了Supplier的內(nèi)容;并且后者會在不允許值為空或other無效的情況拋NullPointerException異常

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容