突然用到,整理一下:
變量存在時,Optional類只是對類簡單封裝。變量不存在時,缺失的值會被建模成一個“空” 的Optional對象,由方法Optional.empty()返回。
Optional.empty()方法是一個靜態工廠 方法,它返回Optional類的特定單一實例。
:如果你嘗試引用一個null,一定會觸發NullPointerException,不過使用 Optional.empty()就完全沒事兒,它是Optional類的一個有效對象,多種場景都能調用,非 常有用。
- 創建Optional對象,使用map 從 Optional 對象中提取和轉換值
- 聲明一個空的Optional ,可以通過靜態工廠方法Optional.empty,創建一個空的Optional 對象:
Optional<Car> optCar = Optional.empty();
- 依據一個非空值創建Optional :還可以使用靜態工廠方法Optional.of,依據一個非空值創建一個Optional對象:如果你把 null 值作為參數傳遞進去,of() 方法會拋出 NullPointerException:
Optional<Car> optCar = Optional.of(car);
- 可接受null的Optional ,使用靜態工廠方法Optional.ofNullable,你可以創建一個允許null值的Optional 對象:
Optional<Car> optCar = Optional.ofNullable(car);
- 聲明一個空的Optional ,可以通過靜態工廠方法Optional.empty,創建一個空的Optional 對象:
- 默認行為即引用的Optional對象.
- get()是這些方法中最簡單但又最不安全的方法。從 Optional 實例中取回實際值對象的方法之一:如果變量存在,它直接返回封裝的變量 值,否則就拋出一個NoSuchElementException異常。所以,除非你非常確定Optional 變量一定包含值,否則使用這個方法是個相當糟糕的主意。此外,這種方式即便相對於 嵌套式的null檢查,也並未體現出多大的改進。要避免異常,你可以選擇首先驗證是否有值:
User user = new User("john@gmail.com", "1234"); Optional<User> opt = Optional.ofNullable(user); assertTrue(opt.isPresent());
- orElse(T other)它允許你在 Optional對象不包含值時提供一個默認值。
- orElseGet(Supplier<? extends T> other)是orElse方法的延遲調用版,Supplier 方法只有在Optional對象不含值時才執行調用。如果創建默認值是件耗時費力的工作, 你應該考慮采用這種方式(借此提升程序的性能),或者你需要非常確定某個方法僅在 Optional為空時才進行調用,也可以考慮該方式(這種情況有嚴格的限制條件)。
- orElseThrow(Supplier<? extends X> exceptionSupplier)和get方法非常類似, 它們遭遇Optional對象為空時都會拋出一個異常,但是使用orElseThrow你可以定制希 望拋出的異常類型。
- 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)
- orElseGet(Supplier<? extends T> other)是orElse方法的延遲調用版,Supplier 方法只有在Optional對象不含值時才執行調用。如果創建默認值是件耗時費力的工作, 你應該考慮采用這種方式(借此提升程序的性能),或者你需要非常確定某個方法僅在 Optional為空時才進行調用,也可以考慮該方式(這種情況有嚴格的限制條件)。