1. 程式人生 > 其它 >Optional Java 8 引入的一個很有趣的類

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。

僅僅用來學習,如有侵權,聯絡我,馬上刪除。




    莫聽穿林打葉聲,何妨吟嘯且徐行!!!