Optional Java 8 引入的一個很有趣的類
空指標異常
Optional 類主要解決的問題是臭名昭著的空指標異常(NullPointerException) —— 每個 Java 程式設計師都非常瞭解的異常。
本質上,這是一個包含有可選值的包裝類,這意味著 Optional 類既可以含有物件也可以為空。
Optional 是 Java 實現函數語言程式設計的強勁一步,並且幫助在正規化中實現。但是 Optional 的意義顯然不止於此。
之前判斷空指標的寫法冗長,難以維護。
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(); } } } }
見證Optional 奇蹟
Optional<User> opt = Optional.of(user);//物件非空
Optional<User> opt = Optional.ofNullable(user);//如果物件即可能是 null 也可能是非 null
Optional<User> emptyOpt = Optional.empty();
訪問Optional物件的值
opt.get() //這個方法會在值為 null 的時候丟擲異常。要避免異常,你可以選擇首先驗證是否有值
opt.isPresent()//驗證是否有值
檢查是否有值的另一個選擇是ifPresent()方法。該方法除了執行檢查,還接受一個Consumer(消費者) 引數,如果物件不是空的,就對執行傳入的 Lambda 表示式:
返回預設值
Optional類提供了 API 用以返回物件值,或者在物件為空的時候返回預設值。這裡你可以使用的第一個方法是orElse()。
orElseGet()—— 其行為略有不同。這個方法會在有值的時候返回值,如果沒有值,它會執行作為引數傳入的Supplier(供應者)
orElseThrow()。它會在物件為空的時候丟擲異常,而不是返回備選的值。
這個方法讓我們有更豐富的語義,可以決定丟擲什麼樣的異常,而不總是丟擲NullPointerException。
轉換值
從map()和flatMap()方法開始。
過濾值 filter
Java 9 增強
我們介紹了Java 8 的特性,Java 9 為 Optional 類添加了三個方法:or()、ifPresentOrElse()和stream()。
or()方法與orElse()和orElseGet()類似,它們都在物件為空的時候提供了替代情況。or()的返回值是由Supplier引數產生的另一個Optional物件。
如果物件包含值,則 Lambda 表示式不會執行:
總結
Optional是 Java 語言的有益補充 —— 它旨在減少程式碼中的NullPointerExceptions,雖然還不能完全消除這些異常。
它也是精心設計,自然融入 Java 8 函式式支援的功能。
總的來說,這個簡單而強大的類有助於建立簡單、可讀性更強、比對應程式錯誤更少的程式。
文章來自:https://www.cnblogs.com/zhangboyu/p/7580262.html。
僅僅用來學習,如有侵權,聯絡我,馬上刪除。
莫聽穿林打葉聲,何妨吟嘯且徐行!!!