日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

null 不好,我推薦你使用 Optional

來源: 責編: 時間:2023-11-18 09:35:49 265觀看
導讀Doug Lea 是一位美國的計算機科學家,他是 Java 平臺的并發和集合框架的主要設計者之一。他在 2014 年的一篇文章中說過:“Null sucks.”1,意思是 null 很糟糕。他認為 null 是一種不明確的表示,它既可以表示一個值不存在,

Doug Lea 是一位美國的計算機科學家,他是 Java 平臺的并發和集合框架的主要設計者之一。他在 2014 年的一篇文章中說過:“Null sucks.”1,意思是 null 很糟糕。他認為 null 是一種不明確的表示,它既可以表示一個值不存在,也可以表示一個值未知,也可以表示一個值無效。這樣就會導致很多邏輯錯誤和空指針異常,給程序員帶來很多麻煩。他建議使用 Optional 類來封裝可能為空的值,從而提高代碼的可讀性和健壯性。q0t28資訊網——每日最新資訊28at.com

"發明 null 引用是我的十億美元錯誤。" - Sir C. A. R. Hoare。q0t28資訊網——每日最新資訊28at.com

Sir C. A. R. Hoare 是一位英國的計算機科學家,他是快速排序算法、Hoare 邏輯和通信順序進程等重要概念的發明者。他在 2009 年的一個軟件會議上道歉說:“I call it my billion-dollar mistake. It was the invention of the null reference in 1965.”,意思是他把 null 引用稱為他的十億美元錯誤。他說他在 1965 年設計 ALGOL W 語言時,引入了 null 引用的概念,用來表示一個對象變量沒有指向任何對象。他當時認為這是一個很簡單和自然的想法,但后來發現這是一個非常糟糕的設計,因為它導致了無數的錯誤、漏洞和系統崩潰。他說他應該使用一個特殊的對象來表示空值,而不是使用 null。q0t28資訊網——每日最新資訊28at.com

自作者從事 Java 編程一來,就與 null 引用相伴,與 NullPointerException 相遇已經是家常便飯了。q0t28資訊網——每日最新資訊28at.com

null 引用是一種表示一個對象變量沒有指向任何對象的方式,它是 Java 語言中的一個特殊值,也是導致空指針異常(NullPointerException)的主要原因。雖然 null 引用可以用來表示一個值不存在或未知,也可以用來節省內存空間。但是它也不符合面向對象的思想,因為它不是一個對象,不能調用任何方法或屬性。q0t28資訊網——每日最新資訊28at.com

可以看到,null 引用并不好,我們應該盡量避免使用 null,那么我們該怎么避免 null 引用引起的邏輯錯誤和運行時異常嘞?q0t28資訊網——每日最新資訊28at.com

其實這個問題 Java 的設計者也知道,于是他們在 Java8 之后設計引入了 Optional 類解決這個問題,本文將給大家詳細介紹下 Optional 類的設計目的以及使用方法。q0t28資訊網——每日最新資訊28at.com

圖片圖片q0t28資訊網——每日最新資訊28at.com

Optional 類是什么?

Optional 類是 java 8 中引入的一個新的類,它的作用是封裝一個可能為空的值,從而避免空指針異常(NullPointerException)。Optional 類可以看作是一個容器,它可以包含一個非空的值,也可以為空。Optional 類提供了一些方法,讓我們可以更方便地處理可能為空的值,而不需要顯式地進行空值檢查或者使用 null。q0t28資訊網——每日最新資訊28at.com

Optional 類的設計

Optional 類的設計是基于函數式編程的思想,它借鑒了 Scala 和 Haskell 等語言中的 Option 類型。Optional 類實現了 java.util.function 包中的 Supplier、Consumer、Predicate、Function 等接口,這使得它可以和 lambda 表達式或者方法引用一起使用,形成更簡潔和優雅的代碼。q0t28資訊網——每日最新資訊28at.com

Optional 類是一個不可變的類,它有兩個子類:Optional.empty 和 Optional.of。Optional.empty 表示一個空的 Optional 對象,它不包含任何值。Optional.of 表示一個非空的 Optional 對象,它包含一個非空的值。我們可以使用這兩個靜態方法來創建 Optional 對象。例如:q0t28資訊網——每日最新資訊28at.com

// 創建一個空的 Optional 對象Optional<String> empty = Optional.empty();// 創建一個非空的 Optional 對象Optional<String> hello = Optional.of("Hello");

注意,如果我們使用 Optional.of 方法傳入一個 null 值,會拋出 NullPointerException。如果我們不確定一個值是否為空,可以使用 Optional.ofNullable 方法,它會根據值是否為空,返回一個相應的 Optional 對象。例如:q0t28資訊網——每日最新資訊28at.com

// 創建一個可能為空的 Optional 對象Optional<String> name = Optional.ofNullable(getName());

Optional 類的使用方法

Optional 類提供了一些方法,讓我們可以更方便地處理可能為空的值,而不需要顯式地進行空值檢查或者使用 null。以下是一些常用的方法:q0t28資訊網——每日最新資訊28at.com

  • isPresent():判斷 Optional 對象是否包含一個非空的值,返回一個布爾值。
  • get():如果 Optional 對象包含一個非空的值,返回該值,否則拋出 NoSuchElementException 異常。
// 使用 isPresent 和 get 方法Optional<String> name = Optional.ofNullable("tom");if (name.isPresent()) {    System.out.println("Hello, " + name.get());} else {    System.out.println("Name is not available");}// 輸出:Hello tom
  • ifPresent(Consumer<? super T> action):如果 Optional 對象包含一個非空的值,執行給定的消費者操作,否則什么也不做。
// 使用 ifPresent(Consumer<? super T> action)Optional<String> name = Optional.ofNullable("tom");name.ifPresent(s -> {    System.out.println("Hello, " + name.get());});// 輸出:Hello tom
  • orElse(T other):如果 Optional 對象包含一個非空的值,返回該值,否則返回給定的默認值。
// 使用 orElse(T other)Optional<String> name = Optional.ofNullable(null);String greeting = "Hello, " + name.orElse("Guest");System.out.println(greeting);// 輸出:Hello Guest
  • orElseGet(Supplier<? extends T> supplier):如果 Optional 對象包含一個非空的值,返回該值,否則返回由給定的供應者操作生成的值。
// 使用 orElseGet(Supplier<? extends T> supplier)Optional<String> name = Optional.ofNullable(null);String greeting = "Hello, " + name.orElseGet(() -> "Guset");System.out.println(greeting);// 輸出:Hello Guset
  • orElseThrow(Supplier<? extends X> exceptionSupplier):如果 Optional 對象包含一個非空的值,返回該值,否則拋出由給定的異常供應者操作生成的異常。
// 使用 orElseThrow(Supplier<? extends X> exceptionSupplier)Optional<String> name = Optional.ofNullable(null);String greeting = "Hello, " + name.orElseThrow(() -> new NullPointerException("null"));// 拋出 java.lang.NullPointerException: null 異常
  • map(Function<? super T,? extends U> mapper):如果 Optional 對象包含一個非空的值,對該值應用給定的映射函數,返回一個包含映射結果的 Optional 對象,否則返回一個空的 Optional 對象。
// 使用 map(Function<? super T,? extends U> mapper)Optional<String> name = Optional.ofNullable("tom");String greeting = "Hello, " + name.map(s -> s.toUpperCase()).get();System.out.println(greeting);// 輸出:Hello TOM
  • flatMap(Function<? super T,Optional<U>> mapper):如果 Optional 對象包含一個非空的值,對該值進行 mapper 參數操作,返回新的 Optional 對象,否則返回一個空的 Optional 對象。
// 使用 flatMap(Function<? super T,Optional<U>> mapper)Optional<String> name = Optional.ofNullable("tom");String greeting = name.flatMap(s -> Optional.of("Hello " + s)).get();System.out.println(greeting);// 輸出:Hello tom
  • filter(Predicate<? super T> predicate):如果 Optional 對象包含一個非空的值,并且該值滿足給定的謂詞條件,返回包含該值的 Optional 對象,否則返回一個空的 Optional 對象。
// filter(Predicate<? super T> predicate)Optional<String> name = Optional.ofNullable("tom");String greeting = "Hello " + name.filter(s -> !s.isEmpty()).get();System.out.println(greeting);// 輸出:Hello tom

Java 9 中 Optional 改進

Java 9 中 Optional 類有了一些改進,主要是增加了三個新的方法,分別是 stream()、ifPresentOrElse() 和 or()。這些方法可以讓我們更方便地處理可能為空的值,以及和流或其他返回 Optional 的方法結合使用。我來詳細講解一下這些方法的作用和用法。q0t28資訊網——每日最新資訊28at.com

  • stream():這個方法可以將一個 Optional 對象轉換為一個 Stream 對象,如果 Optional 對象包含一個非空的值,那么返回的 Stream 對象就包含這個值,否則返回一個空的 Stream 對象。這樣我們就可以利用 Stream 的各種操作來處理 Optional 的值,而不需要顯式地判斷是否為空。我們可以用 stream() 方法來過濾一個包含 Optional 的列表,只保留非空的值,如下所示:
List<Optional<String>> list = Arrays.asList(        Optional.empty(),        Optional.of("A"),        Optional.empty(),        Optional.of("B"));// 使用 stream() 方法過濾列表,只保留非空的值List<String> filteredList = list.stream()        .flatMap(Optional::stream)        .collect(Collectors.toList());System.out.println(filteredList);// 輸出 [A, B]
  • ifPresentOrElse():這個方法可以讓我們在 Optional 對象包含值或者為空時,執行不同的操作。它接受兩個參數,一個是 Consumer 類型的 action,一個是 Runnable 類型的 emptyAction。如果 Optional 對象包含一個非空的值,那么就執行 action.accept(value),如果 Optional 對象為空,那么就執行 emptyAction.run()。這樣我們就可以避免使用 if-else 語句來判斷 Optional 是否為空,而是使用函數式編程的方式來處理不同的情況。我們可以用 ifPresentOrElse() 方法來打印 Optional 的值,或者提示不可用,如下所示 :
Optional<Integer> optional = Optional.of(1);optional.ifPresentOrElse(    x -> System.out.println("Value: " + x),    () -> System.out.println("Not Present."));optional = Optional.empty();optional.ifPresentOrElse(    x -> System.out.println("Value: " + x),    () -> System.out.println("Not Present."));// 輸出:Value: 1// 輸出:Not Present.
  • or():這個方法可以讓我們在 Optional 對象為空時,返回一個預設的值。它接受一個 Supplier 類型的 supplier,如果 Optional 對象包含一個非空的值,那么就返回這個 Optional 對象本身,如果 Optional 對象為空,那么就返回 supplier.get() 返回的 Optional 對象。這樣我們就可以避免使用三元運算符或者其他方式來設置默認值,而是使用函數式編程的方式來提供備選值。我們可以用 or() 方法來設置 Optional 的默認值,如下所示:
Optional<String> optional = Optional.of("Hello ");Supplier<Optional<String>> supplier = () -> Optional.of("tom");optional = optional.or(supplier);optional.ifPresent(x -> System.out.println(x));optional = Optional.empty();optional = optional.or(supplier);optional.ifPresent(x -> System.out.println(x));// 輸出:Hello // 輸出:tom

最后

總結一下使用 Optional 類的幾個好處:q0t28資訊網——每日最新資訊28at.com

  1. 可以避免空指針異常,提高代碼的健壯性和可讀性。
  2. 可以減少顯式的空值檢查和 null 的使用,使代碼更簡潔和優雅。
  3. 可以利用函數式編程的特性,實現更靈活和高效的邏輯處理。
  4. 可以提高代碼的可測試性,方便進行單元測試和集成測試。

總之,Optional 類是一個非常有用的類,它可以幫助我們更好地處理可能為空的值,提高代碼的質量和效率。所以我強烈推薦你在 Java 開發中使用 Optional 類,你會發現它的魅力和好處。q0t28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-28345-0.htmlnull 不好,我推薦你使用 Optional

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: .NET8 正式發布, C#12 新變化

下一篇: 突發!OpenAI的CEO被開了...

標簽:
  • 熱門焦點
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 三星折疊屏手機去年銷售近1000萬臺 今年目標定為1500萬

    7月29日消息,三星率先發力可折疊手機市場,在全球市場已經取得了非常亮眼的成績,接下來會進一步鞏固和擴大這一優勢。三星在推出Galaxy Z Flip5和Galax
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 利用職權私自解除被封帳號 Meta開除20多名員工

    11月18日消息,據外媒援引知情人士表示,過去一年時間內,Facebook母公司Meta解雇或處罰了20多名員工以及合同工,指控這些人通過內部系統以不當方式重置用戶帳號,其
Top 主站蜘蛛池模板: 昌都县| 长丰县| 萝北县| 浏阳市| 兴国县| 普兰县| 东山县| 嘉善县| 抚远县| 蒙自县| 霍山县| 东安县| 南华县| 维西| 三原县| 无棣县| 诸城市| 名山县| 黔江区| 安徽省| 汶川县| 庆安县| 巴青县| 宝丰县| 鹤岗市| 福清市| 年辖:市辖区| 宣威市| 阿拉尔市| 藁城市| 榆树市| 永康市| 和龙市| 德州市| 郑州市| 灯塔市| 汤阴县| 龙胜| 乐东| 台北县| 黑河市|