OPtional的orElse()問題:Optional.orElse()`和`Optional.orElseGet()之間的區別,Optional常用方法使用


突然用到,整理一下:

變量存在時,Optional類只是對類簡單封裝。變量不存在時,缺失的值會被建模成一個“空” 的Optional對象,由方法Optional.empty()返回。


Optional.empty()方法是一個靜態工廠 方法,它返回Optional類的特定單一實例。

  :如果你嘗試引用一個null,一定會觸發NullPointerException,不過使用 Optional.empty()就完全沒事兒,它是Optional類的一個有效對象,多種場景都能調用,非 常有用。

    1. 創建Optional對象,使用map 從 Optional 對象中提取和轉換值 
      1. 聲明一個空的Optional ,可以通過靜態工廠方法Optional.empty,創建一個空的Optional 對象: 
        Optional<Car> optCar = Optional.empty(); 
      2. 依據一個非空值創建Optional :還可以使用靜態工廠方法Optional.of,依據一個非空值創建一個Optional對象:如果你把 null 值作為參數傳遞進去,of() 方法會拋出 NullPointerException: 
        Optional<Car> optCar = Optional.of(car); 
      3. 可接受null的Optional ,使用靜態工廠方法Optional.ofNullable,你可以創建一個允許null值的Optional 對象:
         Optional<Car> optCar = Optional.ofNullable(car); 
    2. 默認行為即引用的Optional對象.
      1.  get()是這些方法中最簡單但又最不安全的方法。從 Optional 實例中取回實際值對象的方法之一:如果變量存在,它直接返回封裝的變量 值,否則就拋出一個NoSuchElementException異常。所以,除非你非常確定Optional 變量一定包含值,否則使用這個方法是個相當糟糕的主意。此外,這種方式即便相對於 嵌套式的null檢查,也並未體現出多大的改進。要避免異常,你可以選擇首先驗證是否有值:
         User user = new User("john@gmail.com", "1234");
            Optional<User> opt = Optional.ofNullable(user);
            assertTrue(opt.isPresent());

      2. orElse(T other)它允許你在 Optional對象不包含值時提供一個默認值
      3. orElseGet(Supplier<? extends T> other)是orElse方法的延遲調用版,Supplier 方法只有在Optional對象不含值時才執行調用。如果創建默認值是件耗時費力的工作, 你應該考慮采用這種方式(借此提升程序的性能),或者你需要非常確定某個方法僅在 Optional為空時才進行調用,也可以考慮該方式(這種情況有嚴格的限制條件)。
      4.  orElseThrow(Supplier<? extends X> exceptionSupplier)和get方法非常類似, 它們遭遇Optional對象為空時都會拋出一個異常,但是使用orElseThrow你可以定制希 望拋出的異常類型
      5. ifPresent(Consumer<? super T>)讓你能在變量值存在時執行一個作為參數傳入的 方法,否則就不進行任何操作。 
        opt.ifPresent( u -> assertEquals(user.getEmail(), u.getEmail()));

         

應用:

Stream中的應用:

代碼中的應用

使用OPtional的orElse()問題:

return Optional.ofNullable(service.A()).orElse(service.B())

 

 這里判斷流程實例是否為空,返回兩個流程實例不為空的那個。如果使用orElse(T)則有可能會報NEP。

 

orElse(T)無論前面Optional容器是null還是non-null,都會執行orElse里的方法,orElseGet(Supplier)並不會,所以當你傳遞的是會報NEP的對象時,或者操作不滿足冪等性,那么你必須使用orElseGet(Supplier<? extends T> other) 而不是orElse(T)

  1. orElseGet(Supplier<? extends T> other)是orElse方法的延遲調用版,Supplier 方法只有在Optional對象不含值時才執行調用。如果創建默認值是件耗時費力的工作, 你應該考慮采用這種方式(借此提升程序的性能),或者你需要非常確定某個方法僅在 Optional為空時才進行調用,也可以考慮該方式(這種情況有嚴格的限制條件)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM