首頁 > Java > java教程 > 主體

掌握 Java 可選:帶有範例的綜合指南

WBOY
發布: 2024-08-23 18:01:02
原創
827 人瀏覽過

簡介:解決零難題

身為 Java 開發人員,我們都遇過惡名昭彰的 NullPointerException (NPE)。就像聚會上的不速之客,在最意想不到的時候出現並引起各種麻煩。但不要害怕! Java 8 引進了一個強大的工具來幫助我們處理這個麻煩:Optional 類別。

在本指南中,我們將透過一系列實際範例來探索Optional。我們將從基礎開始,逐步學習更進階的技術。最後,您將深入了解如何使用Optional來編寫更安全、更具表現力的Java程式碼。

基礎知識:了解可選

讓我們先看一個常見的場景:在清​​單中找出學生。我們將首先了解傳統方法,然後我們將了解Optional如何改進我們的程式碼。

Mastering Java

Mastering Java

讓我們來分解一下。在我們的TraditionalStudentFinder 中,我們使用一個常見的模式:當我們找不到我們要找的內容時傳回null。這看起來很無辜,但實際上它是我們程式碼中的一顆定時炸彈。

當我們嘗試使用結果時,問題就出現了。看一下主要方法。我們正在搜尋“David”,但他不在我們的清單中。當我們嘗試列印找到的學生的名字時,繁榮!我們得到一個 NullPointerException。

問題的根源是我們的 findStudent 方法的簽名沒有給出任何暗示它可能不會返回學生。很容易忘記檢查 null,從而導致難以追蹤的運行時錯誤。

現在,讓我們看看如何使用Optional 來改善這一點。

範例2:引入Optional

Mastering Java

現在好多了!讓我們來看看我們所做的更改。

首先,請注意我們的 findStudent 方法現在回傳一個可選的;而不僅僅是學生。對於任何使用此方法的人來說,這是一個明確的信號,即它可能無法總是找到學生。

在方法內部,當我們找到一個學生時,我們使用Optional.of(s)來包裝學生,當我們沒有找到時,我們使用Optional.empty()。這明確代表了我們搜尋的兩種可能結果。

真正的魔力發生在 main 方法中。我們使用 ifPresentOrElse 方法來處理兩種情況:找到學生時和未找到學生時。不再有 NullPointerException!

這種方法迫使我們考慮可能找不到學生的情況。它使我們的程式碼更加健壯和自記錄。任何閱讀此代碼的人都會立即明白,並不能保證找到學生。

中級技術:利用Optional的力量

現在我們已經掌握了基礎知識,讓我們來探索Optional的一些更高級的功能。這些技術將幫助您編寫更簡潔、更具表現力的程式碼。

範例 3:使用 map() 轉換值

Mastering Java

在這個例子中,我們引入了Optional的map()方法。將map()視為一種轉換Optional內容的方法,而不用擔心它是否為空。

首先,請注意我們如何使用流簡化 findStudent 方法。這是建立可選的更簡潔方法。

有趣的部分是我們如何使用map()。我們選擇我們的可選並將其轉換為可選的;包含學生的大寫姓名。如果沒有找到學生,則 upperCaseName 將只是一個空的可選值。

這很強大,因為它允許我們以空安全的方式連結操作。我們可以轉換Optional的內容,而無需明確的null檢查或if語句。

最後,我們使用 ifPresent() 僅在大寫名稱存在時才列印它。這種 map() 後面跟著 ifPresent() 的模式在使用Optional 時非常常見。

範例 4:使用 flatMap() 進行連結操作

Mastering Java

Mastering Java

現在我們正在使用 flatMap() 冒險進入更複雜的領域。當您有一系列操作且每個操作都會傳回一個可選值時,此方法特別有用。

在此範例中,我們嘗試尋找學生註冊的課程的標題。請注意,我們有兩個傳回可選值的方法:findStudent() 和 getEnrolledCourse()。

魔法發生在這一行:

Mastering Java

我們從尋找學生開始。如果我們找到了,我們就會尋找他們註冊的課程。如果我們找到一門課程,我們就會得到它的標題。在這個鏈中的任何一點,如果我們沒有找到我們正在尋找的東西,我們最終都會得到一個空的Optional。

為什麼要用 flatMap() 而不是 map()?如果我們使用map(),我們最終會得到一個嵌套的Optional(Optional>),這不是我們想要的。 flatMap() 為我們「扁平化」了它,給了我們一個簡單的可選。

這種模式對於處理每一步可能不會產生結果的操作鏈來說非常強大。它使我們能夠以非常乾淨、可讀的方式表達複雜的操作。

進階技術:掌握可選

隨著我們深入研究Optional,我們將探索一些更高級的技術,幫助您編寫更強壯、更具表現力的程式碼。

範例 5:組合多個選項

Mastering Java

在這個進階範例中,我們正在使用多個可選物件。我們有一個方法calculateAverageGrade,它接受兩個Optional參數並傳回一個Optional

這裡的關鍵是我們如何連結 flatMap 操作來處理兩個可選輸入。這確保了只有在學生和課程都存在的情況下才計算平均成績。如果其中一個缺失,我們最終會得到一個空的可選值。

當您需要執行依賴多個可選值的操作時,此模式非常有用。它允許您以乾淨、實用的風格處理所有可能的存在/缺席組合。

範例 6:在 Streams 中使用Optional

Mastering Java

這個範例展示了Optional如何與Java流無縫整合。我們在這裡執行兩項操作:

  • 計算20歲以上學生的平均年齡。

  • 找出年紀最大的學生。

在第一個操作中,如果沒有找到超過 20 歲的學生,我們使用 orElse(0.0) 提供預設值。這是處理流程操作的可選結果時的常見模式。

為了找到最年長的學生,我們使用reduce來比較學生,這會回傳一個Optional。然後,只有在找到學生時,我們才使用 ifPresent 列印結果。

這些範例示範如何在更複雜的場景中有效使用Optional,特別是在使用串流和處理多個可選值時。

結論:擁抱可選以實現更安全的程式碼

我們已經從Optional的基礎知識到它的一些更高級的用途。到目前為止,您應該看到Optional不僅僅是一個空檢查替代品——它是一個強大的工具,可以用來編寫更具表現力、更安全的Java程式碼。

請記住,Optional 的目標不僅僅是避免空檢查,而是迫使我們思考和處理值可能不存在的情況。它使我們的 API 更加誠實,我們的程式碼更加健壯。

當您繼續 Java 之旅時,請在您的工具包中保留Optional。當傳回可能不總是存在的值時使用它,並利用它的方法來編寫更乾淨、更函數式的程式碼。當未來的你(和你的隊友)遇到更少的 NullPointerException 和更多不言自明的程式碼時,他們會感謝你。

掌握 Java 可選:您的後續步驟

恭喜!您剛剛透過學習Optional 提升了您的Java 技能。但為什麼停在這裡呢?讓我們將您的 Java 專業知識提升到新的高度!

?免費核心 Java 掌握課程

準備好成為 Java 專家了嗎?我們全面的核心 Java 課程是您成功的門票 - 而且完全免費!

點這裡開始您的 Java 之旅

在本課程中,您將學習:

  • 高階物件導向程式設計技術
  • 深入了解集合和泛型
  • 掌握異常處理
  • 還有更多!

不要錯過這個提升 Java 技能的機會。成千上萬的開發者已經受益 - 你可能是下一個!

?動手實作:GitHub 儲存庫

理論很棒,但實踐才能完美。我們準備了一個 GitHub 儲存庫,其中包含本教程中的所有程式碼範例,以及用於強化學習的額外挑戰。

存取 Java 選用教學儲存庫

  • 自己運行範例
  • 探索其他用例
  • 貢獻您自己的解決方案

為儲存庫加註星標以表示您的支援並隨時了解新範例!

?要點

記住這些關於可選的關鍵點:

  1. 用它來明確處理可能缺少的值
  2. 利用map()、flatMap() 和filter() 來得到更簡潔的程式碼
  3. 與串流整合以進行強大的資料處理
  4. 總是處理現有和缺席的案例

可選不僅僅是空值檢查 - 它是您獲得更強壯、更具表現力的 Java 程式碼的途徑。

準備好繼續掌握 Java 了嗎?點擊上面的課程鏈接,立即開始像專業人士一樣編碼!

祝您程式設計愉快,課程中見! ??????

以上是掌握 Java 可選:帶有範例的綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!