optional

參考資料:

Java8 Optional用法和最佳實踐 - 掘金

一、背景

根據Oracle文檔,Optional是一個容器對象,可以包含也可以不包含非null值。Optional在Java 8中引入,目的是解決??NullPointerExceptions的問題。本質上,Optional是一個包裝器類,其中包含對其他對象的引用。在這種情況下,對象只是指向內存位置的指針,并且也可以指向任何內容。從其它角度看,Optional提供一種類型級解決方案來表示可選值而不是空引用。

Optional之前

在Java 8之前,程序員將返回null而不是Optional。這種方法有一些缺點。一種是沒有明確的方法來表示null可能是一個特殊值。相比之下,在API中返回Optional是明確的聲明,其中可能沒有值。如果我們要確保不會出現空指針異常,則需要對每個引用進行顯式的空檢查,如下所示,我們都同意這是很多樣板。

// Life before Optionalprivate void getIsoCode( User user){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();}}}}}

為了避免上述繁雜 的? !=null? ,我們可以引入Optional

二、Optional類的對象創建

均為靜態方法創建

1. Optional.empty()

 //第一種創建方式Optional<String> optional=Optional.empty();//判斷是否為空. 此時為 空null,System.out.println(optional.isEmpty());//判斷是否存在。此時不存在,返回falseSystem.out.println(optional.isPresent());//如果optional為null,則會出現異常.  System.out.println(optional.get());

2.Optional.of()

//第二種創建方式//Optional<String> optional=Optional.of(null); //value 不能為null,不然會報錯Optional<String> optional1=Optional.of("123");System.out.println(optional1.get());

3. Optional.ofNullable()

三、檢查Optional的value是否存在

下面代碼中包含了3種判斷方法

   Optional<String> optional=Optional.ofNullable(null);//1.boolean empty = optional.isEmpty();//2.boolean present = optional.isPresent();//3.optional.ifPresent(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("一旦存在,就調用我這個方法");}});

這個filter方法,有點意思,可以自己去判斷是否滿足一個條件,滿足則創建一個新的Optional對象并且value跟所要判斷的optional的value一致。否則返回一個Optional.empty()

四、獲取value的方法

讓gpt解釋一下? orElse() 與orElseGet()的區別

五、Optional的最佳實踐

當你在編寫項目時使用 Optional 類型時,以下是一些最佳實踐建議:

  1. 不要將 Optional 用于方法參數或字段類型

    • Optional 類型主要用于表示可能存在空值的返回值類型。
    • 如果將其用于方法參數或字段類型,則可能會使代碼變得復雜,甚至不必要。
  2. 盡量避免使用 Optional 的 get() 方法

    • Optional 的 get() 方法可以用于獲取 Optional 對象中的值,但如果 Optional 對象為空,則會拋出 NoSuchElementException 異常。
    • 因此,為了避免異常的發生,最好使用其他方法來處理 Optional 對象的值,比如 orElse() 或 orElseGet()。
  3. 使用 Optional 來處理返回值為空的情況

    • 如果一個方法可能返回 null,應該考慮使用 Optional 類型來代替。
    • 這樣可以更明確地表示空值的含義,并提供更加優雅的語法來處理空值的情況。
  4. 使用 Optional 與 Stream API 結合使用

    • Optional 和 Stream API 是 Java 8 中引入的兩個重要特性。
    • 它們結合使用可以提高代碼的可讀性和簡潔性。
    • 可以使用 Optional 的 filter() 和 map() 方法來對 Stream 進行過濾和轉換操作,從而生成新的 Optional 對象。

// 示例 1:使用 Optional 來處理返回值為空的情況
public Optional<String> getOptionalValue(String key) {String value = getValueByKey(key);return Optional.ofNullable(value);
}// 示例 2:使用 Optional 和 Stream API 進行過濾操作
public Optional<User> findUserByName(String name) {List<User> userList = getUserList();return userList.stream().filter(user -> user.getName().equals(name)).findFirst();
}// 示例 3:使用 orElse() 方法提供默認值
Optional<String> optional = Optional.empty();
String result = optional.orElse("default value");// 示例 4:使用 orElseGet() 方法提供默認值
Optional<String> optional = Optional.empty();
String result = optional.orElseGet(() -> generateDefaultValue());// 示例 5:使用 map() 方法將 Optional 對象中的值轉換為其他類型
Optional<String> optional = Optional.of("hello");
Optional<Integer> lengthOptional = optional.map(String::length);// 示例 6:使用 flatMap() 方法展開 Optional 對象
Optional<Optional<String>> optional = Optional.of(Optional.of("hello"));
Optional<String> flattenedOptional = optional.flatMap(Function.identity());

關于示例6的一些解釋:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年網絡安全競賽-網站滲透

網站滲透 (一)拓撲圖 1.使用滲透機對服務器信息收集,并將服務器中網站服務端口號作為flag提交; 使用nmap工具對靶機進行信息收集 2.使用滲透機對服務器信息收集,將網站的名稱作為flag提交; 訪問頁面即可 3.使用滲透機對服務器滲透,將可滲透頁面的名稱作為flag提交…

Python:核心知識點整理大全5-筆記

目錄 2. 使用方法pop()刪除元素 3. 彈出列表中任何位置處的元素 4. 根據值刪除元素 3 章 列表簡介 3.3 組織列表 3.3.1 使用方法 sort()對列表進行永久性排序 3.3.2 使用函數 sorted()對列表進行臨時排序 3.3.3 倒著打印列表 3.3.4 確定列表的長度 3.5 小結 2. 使用方…

軟件測試:測試用例八大要素模板

一、通用測試用例八要素 1、用例編號&#xff1b; 2、測試項目&#xff1b; 3、測試標題&#xff1b; 4、重要級別&#xff1b; 5、預置條件&#xff1b; 6、測試輸入&#xff1b; 7、操作步驟&#xff1b; 8、預期輸出 二、具體分析通用測試用例八要素 1、用例編號 一般是數字…

[NAND Flash 2.1] NAND Flash 閃存改變了現代生活

依公知及經驗整理&#xff0c;原創保護&#xff0c;禁止轉載。 專欄 《深入理解NAND Flash》 <<<< 返回總目錄 <<<< ? 1989年NAND閃存面世了&#xff0c;它曾經且正在改變了我們的日常生活。 NAND 閃存發明之所以偉大&#xff0c;是因為&#xff0c…

一個CV算法工程師在技術方面的小反思

極市導讀 正如作者所說,做一個算法工程師最重要的素質是在海量的算法方案中理解,吃透那些真正的干貨,然后不斷在實踐中去驗證,并總結吸收到自己的腦子里。本文記錄了作者在算法工程師這個崗位上一年后總結的一些關于技術上的經驗總結。>>加入極市CV技術交流群,走在計…

怎樣解決編譯后的exe文件運行時產生的錯誤?

編譯后的exe文件運行時&#xff0c;錯誤如下錯誤提示&#xff1a;Traceback (most recent call last):File "pd.py", line 1, in <module>from pdf2docx import parse ModuleNotFoundError: No module named pdf2docx 怎樣解決&#xff1f; 這個錯誤提示表明…

java數據結構面試題

1.棧和隊列的共同特點是&#xff08;只允許在端點處插入和刪除元素&#xff09; 4.棧通常采用的兩種存儲結構是&#xff08;線性存儲結構和鏈表存儲結構&#xff09; 5.下列關于棧的敘述正確的是&#xff08;D&#xff09; A.棧是非線性結構 B.棧是一種樹狀結構 C.棧具有先進先…

蘋果OS X系統介紹(Mac OS --> Mac OS X --> OS X --> macOS)

文章目錄 OS X系統介紹歷史與版本架構內核與低級系統圖形&#xff0c;媒體和用戶界面應用程序和服務 特性用戶友好強大的命令行安全性集成與互操作性 總結 OS X系統介紹 OS X是由蘋果公司為Macintosh計算機系列設計的基于UNIX的操作系統。其界面友好&#xff0c;易于使用&…

使用 nohup java - jar 不輸出日志

要在使用nohup java -jar命令時不輸出日志&#xff0c;可以將標準輸出和標準錯誤輸出重定向到特殊設備文件/dev/null。這樣做將會丟棄所有的輸出。 以下是在Linux中使用nohup java -jar命令并禁止輸出日志的示例&#xff1a; 復制代碼 nohup java -jar your-application.jar …

Python可視化(二)——Seaborn

Seaborn是一個基于matplotlib的可視化庫&#xff0c;其為用戶提供了高級接口&#xff0c;并且該工具還深度集成了pandas的數據結構。并且該工具該集成了很多數據庫&#xff0c;配合官網給出的代碼示例&#xff0c;可以更方便的進行操作。 官網對它的介紹為&#xff1a; Seabo…

Servlet學習筆記

簡介 瀏覽器請求處理流程&#xff1a;瀏覽器發請求 > 服務器tomcat( > 應用程序 ( > servlet) ) Servlet應用的三大作用域&#xff1a;request&#xff0c;session&#xff0c;application tomcat存放項目的層級結構 注釋&#xff1a;servlet原引用包名 javax.serv…

卡爾曼濾波器

歡迎訪問我的博客首頁。 卡爾曼濾波器 1. 參考 1. 參考 卡爾曼濾波器&#xff0c;B 站&#xff0c;2020。擴展卡爾曼濾波器&#xff0c;CSDN&#xff0c;2023。

Git的安裝以及SSH配置

前言 近期工作需要&#xff0c;所以版本管理工具要用到Git&#xff0c;某些操作需要ssh進行操作&#xff0c;在某次操作中遇到&#xff1a;git bash報錯&#xff1a;Permission denied, please try again。經排查是ssh沒有配置我的key&#xff0c;所以就借著這篇文章整理了一下…

WorkPlus即時通訊,讓溝通零障礙!企業協作更高效

如今&#xff0c;隨著信息技術的快速發展&#xff0c;企業對于高效溝通和即時協作的需求也日益增長。在這個數字化時代&#xff0c;WorkPlus作為一款領先的企業級移動辦公平臺&#xff0c;以其強大的即時通訊功能和卓越的用戶體驗&#xff0c;成功為企業打造了高效溝通的新時代…

input = torch.randn(20, 2, 11, 11, 32)輸出形式

input torch.randn(20, 2, 11, 11, 32) m torch.nn.AdaptiveAvgPool3d((1,1, 32)) xm(input) print(x.shape) 結果&#xff1a; 也就是不用管批次和通道數

pico示波器使用

文章目錄 Pico示波器保存波形Pico示波器錄制數據Pico示波器解析CAN報文Pico示波器保存波形 Pico示波器可以通過以下步驟保存波形: 在示波器上選擇要保存的波形。連接示波器到計算機上,可以使用USB或者Ethernet連接。打開PicoScope軟件,選擇“File”菜單,然后選擇“Save As…

Python開發運維:Python垃圾回收機制

目錄 一、理論 1.Python垃圾回收機制 一、理論 1.Python垃圾回收機制 &#xff08;1&#xff09;引?計數器 1&#xff09;環狀雙向鏈表 refchain 在python程序中創建的任何對象都會放在refchain鏈表中。 name "david" age 20 hobby ["籃球",游泳…

放蘋果 .

把m個同樣的蘋果放在n個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問共有多少種不同的分法&#xff1f; 注意&#xff1a;如果有7個蘋果和3個盤子&#xff0c;&#xff08;5&#xff0c;1&#xff0c;1&#xff09;和&#xff08;1&#xff0c;5&#xff0c;1&…

spring集成mybatis簡單教程

首先說下實現了什么效果&#xff0c;就是不用每次查詢前手動創建 sessionFactory和添加datasource文件了。 整個工程結構是這樣的 這次我也把代碼放在了gitee上&#xff0c;方便大家更全貌的看到所有的實現細節。代碼鏈接如下&#xff1a; Java: 一些Java代碼 (gitee.com) …

大話數據結構-查找-多路查找樹

注&#xff1a;本文同步發布于稀土掘金。 7 多路查找樹 多路查找樹&#xff08;multi-way search tree&#xff09;&#xff0c;其每個結點的孩子可以多于兩個&#xff0c;且每一個結點處可以存儲多個元素。由于它是查找樹&#xff0c;所有元素之間存在某種特定的排序關系。 …