精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

null 不好,我推薦你使用 Optional

開發 前端
Optional 類是一個非常有用的類,它可以幫助我們更好地處理可能為空的值,提高代碼的質量和效率。所以我強烈推薦你在 Java 開發中使用 Optional 類,你會發現它的魅力和好處。

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

"發明 null 引用是我的十億美元錯誤。" - Sir C. A. R. Hoare。

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。

自作者從事 Java 編程一來,就與 null 引用相伴,與 NullPointerException 相遇已經是家常便飯了。

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

可以看到,null 引用并不好,我們應該盡量避免使用 null,那么我們該怎么避免 null 引用引起的邏輯錯誤和運行時異常嘞?

其實這個問題 Java 的設計者也知道,于是他們在 Java8 之后設計引入了 Optional 類解決這個問題,本文將給大家詳細介紹下 Optional 類的設計目的以及使用方法。

圖片圖片

Optional 類是什么?

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

Optional 類的設計

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

Optional 類是一個不可變的類,它有兩個子類:Optional.empty 和 Optional.of。Optional.empty 表示一個空的 Optional 對象,它不包含任何值。Optional.of 表示一個非空的 Optional 對象,它包含一個非空的值。我們可以使用這兩個靜態方法來創建 Optional 對象。例如:

// 創建一個空的 Optional 對象
Optional<String> empty = Optional.empty();

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

注意,如果我們使用 Optional.of 方法傳入一個 null 值,會拋出 NullPointerException。如果我們不確定一個值是否為空,可以使用 Optional.ofNullable 方法,它會根據值是否為空,返回一個相應的 Optional 對象。例如:

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

Optional 類的使用方法

Optional 類提供了一些方法,讓我們可以更方便地處理可能為空的值,而不需要顯式地進行空值檢查或者使用 null。以下是一些常用的方法:

  • 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 的方法結合使用。我來詳細講解一下這些方法的作用和用法。

  • 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 類的幾個好處:

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

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

責任編輯:武曉燕 來源: waynblog
相關推薦

2021-06-25 11:19:04

LinuxWindows操作系統

2021-07-04 14:19:03

RabbitMQ消息轉換

2022-05-17 14:28:42

編程語言Julia代碼

2017-01-09 12:57:21

Linux

2020-09-17 14:31:48

Go語言方法

2019-08-28 10:53:35

JavaScriptOptional Ch代碼

2021-04-18 18:58:16

JRebelJVM插件

2019-06-25 15:00:53

SpringNullJava

2020-05-13 09:03:14

Python開發代碼

2023-01-24 16:13:22

編程語言JavaIT

2023-10-08 11:09:22

Optional空指針

2024-05-27 00:19:47

2022-08-08 20:33:12

VolatileJVM

2021-05-13 09:27:13

JavaThreadLocal線程

2015-07-03 09:37:21

程序員外包公司

2020-12-29 08:47:45

緩沖SQL磁盤

2020-10-19 11:05:17

SpringTransaction事務

2022-09-07 11:38:04

async代碼前端

2017-09-23 15:28:32

JavaOptional方法

2024-12-06 10:12:20

點贊
收藏

51CTO技術棧公眾號

国产精品亚洲精品| 亚洲网站视频福利| 久久亚洲精品无码va白人极品| jizz中国女人| 中文高清一区| 最近2019年好看中文字幕视频| 欧洲在线免费视频| 日本在线影院| 国产精品系列在线| 国产传媒一区二区三区| 久久精品视频1| 欧美电影免费播放| 亚洲国产精品免费| 小泽玛利亚视频在线观看| 久操av在线| 国产女主播一区| 高清日韩一区| 中文字幕久久久久| 亚洲激情欧美| 久久久国产影院| 四虎永久免费在线观看| 视频在线一区| 欧美三级日韩在线| 久久久亚洲精品无码| 麻豆视频在线免费观看| 91丨九色porny丨蝌蚪| 91中文字幕一区| 亚洲图片欧美日韩| 亚洲激情婷婷| 欧美疯狂xxxx大交乱88av| 精品亚洲aⅴ无码一区二区三区| 超碰精品在线| 欧美精品久久99久久在免费线 | 亚洲xxx自由成熟| 免费黄色片视频| 亚洲精品免费观看| 欧美麻豆久久久久久中文| 天天舔天天操天天干| 亚洲+变态+欧美+另类+精品| 日韩欧美的一区| www.桃色.com| 国产国产一区| 在线看国产一区| 欧美日韩中文在线视频| √天堂8资源中文在线| 亚洲人成在线观看一区二区| 亚洲精品不卡| www 日韩| 欧美韩国一区二区| 神马影院我不卡| 岛国最新视频免费在线观看| 久久久亚洲精品石原莉奈| 精品久久久三级| 日本wwwxxxx| 不卡视频在线看| 国产一区免费在线观看| 理论片中文字幕| 成人av免费在线播放| 国产精品一区二区你懂得| 亚洲av无码一区二区三区dv| 国产精品一区二区在线看| 亚洲在线免费观看| 亚洲第一页综合| 成人午夜又粗又硬又大| 极品校花啪啪激情久久| 四虎国产精品永远| 久久久久99精品国产片| 日韩成人在线资源| 成人免费视频| 日韩码欧中文字| 亚洲啊啊啊啊啊| av白虎一区| 欧美性生活大片免费观看网址| 欧美日韩在线不卡视频| 四虎4545www国产精品| 欧美日韩不卡一区| 四虎永久免费观看| 婷婷成人综合| 主播福利视频一区| 特级片在线观看| 999亚洲国产精| 国产精品福利在线观看网址| 国产又粗又猛又爽| 盗摄精品av一区二区三区| 明星裸体视频一区二区| av午夜在线| 亚洲一区二区精品视频| 无码人妻丰满熟妇区五十路百度| www.成人在线视频| 欧美成人精品二区三区99精品| 亚洲av永久无码精品| 欧美精美视频| 久久成人国产精品| 午夜婷婷在线观看| 国内精品久久久久影院色| 国产精品一 二 三| 日本综合在线| 亚洲一区二区免费视频| 亚洲一区二区三区四区五区xx| 亚洲一区二区av| 日韩福利在线播放| 强制高潮抽搐sm调教高h| 在线 亚洲欧美在线综合一区| 欧洲成人免费aa| 999av视频| 久久久精品天堂| 国产欧美123| 国产v综合v| 精品成人一区二区三区| 人妻无码一区二区三区免费| 精品999日本| 国产美女精彩久久| 天天操天天干天天爱| 综合网在线视频| www.亚洲天堂网| 最新国产一区二区| 日韩在线免费观看视频| 粉嫩aⅴ一区二区三区| 久久精品国产免费| 日本视频一区二区不卡| 欧美卡一卡二| 91麻豆精品国产91久久久更新时间| 日本japanese极品少妇| 欧美一区激情| 成人xvideos免费视频| 日韩av高清在线| 亚洲综合免费观看高清完整版在线| 天天操天天爽天天射| 嫩草国产精品入口| 欧美疯狂性受xxxxx另类| 97精品久久人人爽人人爽| 久久久99免费| 男人日女人bb视频| 欧美18免费视频| 97在线视频免费| 亚洲免费一级片| 亚洲精品免费在线| 午夜久久久精品| 欧美丝袜激情| 国产精品xxx视频| 国产区在线视频| 在线一区二区三区四区五区| 免费成人深夜夜行p站| 影音先锋久久久| 国产高清精品一区二区三区| 中文字幕中文字幕在线十八区| 欧美精品三级日韩久久| 久久嫩草捆绑紧缚| 国模大尺度一区二区三区| 在线视频不卡国产| av一级久久| 久久综合国产精品台湾中文娱乐网| 国产一区二区女内射| 中文字幕一区二区三区四区| 中文字幕色网站| 最新精品国产| 福利视频久久| 日韩av影片| 亚洲人成网站免费播放| 亚洲图片欧美日韩| 国产精品情趣视频| 久久久精品高清| 综合天天久久| 国产一级二级三级精品| 涩涩视频在线播放| 日韩精品极品毛片系列视频| 免费黄色片视频| 最好看的中文字幕久久| 亚洲精品无码久久久久久久| 国产精品大片免费观看| 国产青春久久久国产毛片| 在线天堂资源| 中文字幕亚洲综合久久| 国产男女无套免费网站| 性欧美大战久久久久久久久| av在线网站观看| 奇米一区二区三区| xxxxxx在线观看| 欧美大胆a级| 国产欧美日韩综合精品| 日韩激情美女| 亚洲人成网站777色婷婷| 国产又大又粗又硬| 精品美女永久免费视频| 五月天综合视频| 国产精品资源在线观看| 美女日批免费视频| 久久福利综合| 国产精品免费看一区二区三区| 悠悠资源网亚洲青| 日韩在线中文字幕| 色婷婷在线视频| 欧美色欧美亚洲另类二区| 国产亚洲欧美精品久久久www| 久久久久久久综合狠狠综合| 99精品999| 每日更新成人在线视频| 8x8x华人在线| 欧美男男gaytwinkfreevideos| 91精品国自产在线观看| 亚州一区二区三区| 欧美激情亚洲综合一区| 韩国三级av在线免费观看| 日韩欧美专区在线| 久久永久免费视频| 亚洲电影中文字幕在线观看| 国产三级短视频| av成人免费在线| 日本精品一区在线| 蜜桃一区二区三区在线| 国产h视频在线播放| 久久久久蜜桃| 日韩欧美视频一区二区| 风间由美性色一区二区三区四区| 国产精品久久久久久久久影视| caopen在线视频| 一本一本久久a久久精品牛牛影视| 亚洲国产www| 欧美精品aⅴ在线视频| 手机av免费观看| 精品福利在线视频| 国产一级理论片| 最近中文字幕一区二区三区| 久久视频精品在线观看| 91免费小视频| 黄色片视频免费观看| 国产jizzjizz一区二区| 午夜免费看毛片| 日本色综合中文字幕| 国产成人黄色片| 亚洲三级免费| 97精品国产97久久久久久粉红| 日本午夜一区| 日本在线观看一区二区三区| 亚洲成人一品| 国模精品娜娜一二三区| 成午夜精品一区二区三区软件| 91青青草免费在线看| 成人永久在线| 成人免费在线视频网站| 欧美videos粗暴| 国产精品日韩欧美大师| 欧美aaa大片视频一二区| 国产成人精品a视频一区www| 综合日韩av| 日韩美女免费线视频| 日本免费一区二区三区四区| 欧美一区二区三区四区在线 | 国产成人精品久久亚洲高清不卡| av手机免费在线观看| 欧美精品videofree1080p| av电影院在线看| 国产91成人在在线播放| 妞干网免费在线视频| 2019国产精品自在线拍国产不卡| 岛国av在线网站| 5566成人精品视频免费| 老司机2019福利精品视频导航| 日韩免费中文字幕| 成人国产激情| 亚洲自拍欧美另类| 大伊香蕉精品在线品播放| 精品欧美一区二区精品久久| 最新亚洲精品| 亚洲欧洲久久| 在线成人直播| 三上悠亚久久精品| 久久一本综合频道| 一起操在线视频| 国产精品影视网| 性囗交免费视频观看| www亚洲一区| 5566中文字幕| 亚洲综合色视频| 日本特级黄色片| 欧美性xxxxxx少妇| 国产高中女学生第一次| 亚洲第一视频网| 天堂在线中文资源| 日韩专区在线播放| 麻豆福利在线观看| 国产精品欧美风情| 日韩精品一区二区三区中文字幕| 久久66热这里只有精品| 久久综合电影| 男的插女的下面视频| 三级一区在线视频先锋| 一级淫片在线观看| 成人动漫av在线| 性欧美一区二区| 一区二区成人在线视频| 91在线视频免费播放| 777xxx欧美| 日本一区高清| 美女av一区二区三区| 亚洲黄色免费av| 亚洲精品免费网站| 国产精品亚洲二区| 成年在线观看视频| 日本成人中文字幕在线视频| 国产精品99精品无码视亚| 国产亚洲精久久久久久| 中文字幕在线有码| 欧美网站大全在线观看| 国精产品一品二品国精品69xx | 日韩午夜小视频| 成人在线播放视频| 午夜欧美大片免费观看| 精品一区二区三区免费看| 欧美在线播放一区二区| 国产综合网站| 激情图片中文字幕| 国产欧美精品一区aⅴ影院 | 51精品国自产在线| 青青草免费观看免费视频在线| 久热精品视频在线观看| 成人日韩在线| 麻豆精品视频| 亚洲大胆视频| 免费高清视频在线观看| 国产精品久久久久一区二区三区 | 欧美日韩国产综合视频在线观看| 婷婷av一区二区三区| 免费不卡欧美自拍视频| 欧美网站免费| 日韩偷拍一区二区| 亚洲欧美网站| 特级西西人体wwwww| 亚洲图片欧美色图| 成人免费视频国产| 欧美日韩福利视频| 韩国一区二区三区视频| 天天综合中文字幕| 久热成人在线视频| 欧美精品日韩在线| 在线观看免费视频综合| 免费在线超碰| 国产91在线播放九色快色| 亚洲免费专区| 欧美韩国日本在线| 26uuu色噜噜精品一区| 国产精品黄色网| 日韩av在线看| 在线视频cao| 日本成人三级| 日本亚洲最大的色成网站www| 无码少妇精品一区二区免费动态| 日韩欧美在线视频| 猫咪在线永久网站| 国产精品久久久av| 成人vr资源| 免费在线观看污网站| 中文字幕日韩一区| 国产激情视频在线播放| 色中色综合影院手机版在线观看| 久久久91麻豆精品国产一区| 欧美日韩午夜爽爽| 成人午夜又粗又硬又大| 五月天婷婷综合网| 亚洲精品mp4| av有声小说一区二区三区| 日韩亚洲视频在线| 久久精品国产99久久6| 免费三级在线观看| 欧美不卡一区二区| 色偷偷偷在线视频播放| 日韩电影大全在线观看| 经典三级在线一区| 久热这里只有精品在线| 亚洲精品成人网| 欧美va视频| 无码人妻aⅴ一区二区三区日本| 粉嫩久久99精品久久久久久夜| 国产无遮挡免费视频| 亚洲女人天堂视频| 亚洲天堂网站| 国产h视频在线播放| 中文字幕成人在线观看| 国产特级黄色片| 欧美一区第一页| 天天做天天爱天天综合网| 一级黄色片毛片| 欧美午夜精品久久久久久孕妇 | 国内自拍第二页| 亚洲成人av电影| 在线观看美女网站大全免费| 91免费在线观看网站| 久久夜色精品| 久久精品第一页| 亚洲午夜性刺激影院| 一区二区亚洲视频| 我要看一级黄色大片| 亚洲一区中文在线| 在线免费观看黄色| 国产欧美一区二区三区另类精品 | 国产欧美日韩中文字幕| 在线观看日韩av电影| 青青青视频在线免费观看| 亚洲成人网av| 四虎国产精品永久在线国在线 |