身為 Java 開發人員,我們都遇過惡名昭彰的 NullPointerException (NPE)。就像聚會上的不速之客,在最意想不到的時候出現並引起各種麻煩。但不要害怕! Java 8 引進了一個強大的工具來幫助我們處理這個麻煩:Optional 類別。
在本指南中,我們將透過一系列實際範例來探索Optional。我們將從基礎開始,逐步學習更進階的技術。最後,您將深入了解如何使用Optional來編寫更安全、更具表現力的Java程式碼。
讓我們先看一個常見的場景:在清單中找出學生。我們將首先了解傳統方法,然後我們將了解Optional如何改進我們的程式碼。
讓我們來分解一下。在我們的TraditionalStudentFinder 中,我們使用一個常見的模式:當我們找不到我們要找的內容時傳回null。這看起來很無辜,但實際上它是我們程式碼中的一顆定時炸彈。
當我們嘗試使用結果時,問題就出現了。看一下主要方法。我們正在搜尋“David”,但他不在我們的清單中。當我們嘗試列印找到的學生的名字時,繁榮!我們得到一個 NullPointerException。
問題的根源是我們的 findStudent 方法的簽名沒有給出任何暗示它可能不會返回學生。很容易忘記檢查 null,從而導致難以追蹤的運行時錯誤。
現在,讓我們看看如何使用Optional 來改善這一點。
範例2:引入Optional
現在好多了!讓我們來看看我們所做的更改。
首先,請注意我們的 findStudent 方法現在回傳一個可選的
在方法內部,當我們找到一個學生時,我們使用Optional.of(s)來包裝學生,當我們沒有找到時,我們使用Optional.empty()。這明確代表了我們搜尋的兩種可能結果。
真正的魔力發生在 main 方法中。我們使用 ifPresentOrElse 方法來處理兩種情況:找到學生時和未找到學生時。不再有 NullPointerException!
這種方法迫使我們考慮可能找不到學生的情況。它使我們的程式碼更加健壯和自記錄。任何閱讀此代碼的人都會立即明白,並不能保證找到學生。
現在我們已經掌握了基礎知識,讓我們來探索Optional的一些更高級的功能。這些技術將幫助您編寫更簡潔、更具表現力的程式碼。
範例 3:使用 map() 轉換值
在這個例子中,我們引入了Optional的map()方法。將map()視為一種轉換Optional內容的方法,而不用擔心它是否為空。
首先,請注意我們如何使用流簡化 findStudent 方法。這是建立可選
有趣的部分是我們如何使用map()。我們選擇我們的可選並將其轉換為可選的
這很強大,因為它允許我們以空安全的方式連結操作。我們可以轉換Optional的內容,而無需明確的null檢查或if語句。
最後,我們使用 ifPresent() 僅在大寫名稱存在時才列印它。這種 map() 後面跟著 ifPresent() 的模式在使用Optional 時非常常見。
範例 4:使用 flatMap() 進行連結操作
現在我們正在使用 flatMap() 冒險進入更複雜的領域。當您有一系列操作且每個操作都會傳回一個可選值時,此方法特別有用。
在此範例中,我們嘗試尋找學生註冊的課程的標題。請注意,我們有兩個傳回可選值的方法:findStudent() 和 getEnrolledCourse()。
魔法發生在這一行:
我們從尋找學生開始。如果我們找到了,我們就會尋找他們註冊的課程。如果我們找到一門課程,我們就會得到它的標題。在這個鏈中的任何一點,如果我們沒有找到我們正在尋找的東西,我們最終都會得到一個空的Optional。
為什麼要用 flatMap() 而不是 map()?如果我們使用map(),我們最終會得到一個嵌套的Optional(Optional
這種模式對於處理每一步可能不會產生結果的操作鏈來說非常強大。它使我們能夠以非常乾淨、可讀的方式表達複雜的操作。
隨著我們深入研究Optional,我們將探索一些更高級的技術,幫助您編寫更強壯、更具表現力的程式碼。
範例 5:組合多個選項
在這個進階範例中,我們正在使用多個可選物件。我們有一個方法calculateAverageGrade,它接受兩個Optional參數並傳回一個Optional
這裡的關鍵是我們如何連結 flatMap 操作來處理兩個可選輸入。這確保了只有在學生和課程都存在的情況下才計算平均成績。如果其中一個缺失,我們最終會得到一個空的可選值。
當您需要執行依賴多個可選值的操作時,此模式非常有用。它允許您以乾淨、實用的風格處理所有可能的存在/缺席組合。
範例 6:在 Streams 中使用Optional
這個範例展示了Optional如何與Java流無縫整合。我們在這裡執行兩項操作:
計算20歲以上學生的平均年齡。
找出年紀最大的學生。
在第一個操作中,如果沒有找到超過 20 歲的學生,我們使用 orElse(0.0) 提供預設值。這是處理流程操作的可選結果時的常見模式。
為了找到最年長的學生,我們使用reduce來比較學生,這會回傳一個Optional
這些範例示範如何在更複雜的場景中有效使用Optional,特別是在使用串流和處理多個可選值時。
結論:擁抱可選以實現更安全的程式碼
我們已經從Optional的基礎知識到它的一些更高級的用途。到目前為止,您應該看到Optional不僅僅是一個空檢查替代品——它是一個強大的工具,可以用來編寫更具表現力、更安全的Java程式碼。
請記住,Optional 的目標不僅僅是避免空檢查,而是迫使我們思考和處理值可能不存在的情況。它使我們的 API 更加誠實,我們的程式碼更加健壯。
當您繼續 Java 之旅時,請在您的工具包中保留Optional。當傳回可能不總是存在的值時使用它,並利用它的方法來編寫更乾淨、更函數式的程式碼。當未來的你(和你的隊友)遇到更少的 NullPointerException 和更多不言自明的程式碼時,他們會感謝你。
掌握 Java 可選:您的後續步驟
恭喜!您剛剛透過學習Optional 提升了您的Java 技能。但為什麼停在這裡呢?讓我們將您的 Java 專業知識提升到新的高度!
?免費核心 Java 掌握課程
準備好成為 Java 專家了嗎?我們全面的核心 Java 課程是您成功的門票 - 而且完全免費!
點這裡開始您的 Java 之旅
在本課程中,您將學習:
不要錯過這個提升 Java 技能的機會。成千上萬的開發者已經受益 - 你可能是下一個!
?動手實作:GitHub 儲存庫
理論很棒,但實踐才能完美。我們準備了一個 GitHub 儲存庫,其中包含本教程中的所有程式碼範例,以及用於強化學習的額外挑戰。
存取 Java 選用教學儲存庫
為儲存庫加註星標以表示您的支援並隨時了解新範例!
?要點
記住這些關於可選的關鍵點:
可選不僅僅是空值檢查 - 它是您獲得更強壯、更具表現力的 Java 程式碼的途徑。
準備好繼續掌握 Java 了嗎?點擊上面的課程鏈接,立即開始像專業人士一樣編碼!
祝您程式設計愉快,課程中見! ??????
以上是掌握 Java 可選:帶有範例的綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!