快速掌握J(rèn)ava8中的Optional
自從Java 8在2014年發(fā)布以來(lái),它引入了很多有用的特性,其中之一就是Optional
類。這個(gè)類被設(shè)計(jì)成Java語(yǔ)言的一個(gè)解決方案,用于解決空指針異常(NullPointerException
),這是Java開(kāi)發(fā)者們面臨的常見(jiàn)問(wèn)題之一。在這篇博客中,我們將深入探討Java的Optional
。
什么是 Optional?
Optional
是一個(gè)容器類,代表一個(gè)值存在或不存在。原始版本的Java沒(méi)有空安全的類型,這意味著任何東西都可能是null,而這經(jīng)常會(huì)導(dǎo)致NullPointerException
。因此,Optional
的出現(xiàn)使得我們可以更優(yōu)雅地處理可能為null的情況。
如何使用Optional?
創(chuàng)建Optional對(duì)象
創(chuàng)建一個(gè)非空的Optional
:
// 使用of方法創(chuàng)建包含值的Optional。參數(shù)不能為null,否則會(huì)立即拋出NullPointerException。 Optional<String> optional = Optional.of("Hello World");
創(chuàng)建一個(gè)可能為空的Optional
:
// 使用ofNullable方法創(chuàng)建可以包含null的Optional。如果參數(shù)為null,它將創(chuàng)建一個(gè)空的Optional對(duì)象。 Optional<String> optionalNullable = Optional.ofNullable(null);
訪問(wèn)Optional對(duì)象的值
使用get()
方法來(lái)獲取Optional
的值,如果Optional
為空則拋出NoSuchElementException
異常:
String value = optional.get();
使用isPresent()
方法來(lái)檢查Optional
是否有值:
// isPresent方法用于檢查Optional實(shí)例中是否包含非null值。 if (optional.isPresent()) { System.out.println("Value found - " + optional.get()); }
使用ifPresent()
方法進(jìn)行更優(yōu)雅的檢查和使用:
// ifPresent方法接收一個(gè)Consumer(消費(fèi)者)參數(shù),僅當(dāng)Optional中有值存在時(shí),才執(zhí)行傳入的lambda表達(dá)式(或方法引用)。 optional.ifPresent(value -> System.out.println("Value found - " + value));
如果你想在Optional
為空的時(shí)候提供一個(gè)備用值,你可以使用orElse()
方法:
// orElse方法允許在Optional對(duì)象不包含值時(shí)提供一個(gè)備選值。 String nullDefault = optionalNullable.orElse("Default Value"); System.out.println(nullDefault); // 輸出:Default Value
或者使用orElseGet()
方法進(jìn)行延遲計(jì)算備用值:
String value = optional.orElseGet(() -> "default value");
鏈?zhǔn)秸{(diào)用Optional
Optional
還支持鏈?zhǔn)椒椒ㄕ{(diào)用,如map
和flatMap
,這使得它能夠和Java 8的其他特性如Stream
和lambda
表達(dá)式一起更好地工作:
map 和 flatMap
map
和 flatMap
方法在函數(shù)式編程中用得非常廣泛,它們也在Optional中被定義:
// 假設(shè)有一個(gè)方法parse(String str),str可能為null,解析后的結(jié)果也可能為null Optional<String> str = Optional.ofNullable(getStr()); // 不使用map,我們需要進(jìn)行兩次null檢查 if(str != null){ String result = parse(str); if(result != null){ System.out.println(result); } } // 使用Optional和map,可以避免顯示null檢查 str.map(this::parse).ifPresent(System.out::println);
注意,map操作需要Function作為參數(shù),所以你的方法不能返回Optional類型。如果你要返回Optional,你應(yīng)該使用flatMap,否則你會(huì)得到套裝的Optional:
// 使用map,你會(huì)得到Optional<Optional<Integer>> Optional<Optional<Integer>> nestedOptional = str.map(this::parseToOptional); // 使用flatMap,你會(huì)得到Optional<Integer> Optional<Integer> flatOptional = str.flatMap(this::parseToOptional);
filter
filter方法與Stream中的filter類似,它接收Predicate參數(shù),用于測(cè)試Optional中是否有值符合給定的條件:
Optional<String> filtered = str.filter(val -> val.length() > 3); // 如果Optional中的值長(zhǎng)度大于3,那么仍舊返回包含該值的Optional // 否則返回一個(gè)空的Optional實(shí)例
總結(jié)起來(lái),Optional并不是用來(lái)替換所有的null,而是為了在設(shè)計(jì)良好的API中更明確地表達(dá)可能缺失的值。通過(guò)明晰地表示"值可能不存在",Optional可以幫助我們?cè)O(shè)計(jì)更清晰、更易于理解的API,從而減少Bug的出現(xiàn)率。
到此這篇關(guān)于Java8的Optional的文章就介紹到這了,更多相關(guān)Java8的Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析
這篇文章主要介紹了Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程分析
這篇文章主要介紹了springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程,本次使用jar包啟動(dòng)后端,故而準(zhǔn)備打包后的jar文件,需要的朋友可以參考下2022-12-12關(guān)于spring5的那些事:@Indexed 解密
這篇文章主要介紹了關(guān)于spring5的那些事:@Indexed 解密,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們?cè)跀?shù)據(jù)庫(kù)都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03Java C++解決在排序數(shù)組中查找數(shù)字出現(xiàn)次數(shù)問(wèn)題
本文終于介紹了分別通過(guò)Java和C++實(shí)現(xiàn)統(tǒng)計(jì)一個(gè)數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)。文中詳細(xì)介紹了實(shí)現(xiàn)思路,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2021-12-12springboot使用ThreadPoolTaskExecutor多線程批量插入百萬(wàn)級(jí)數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot利用ThreadPoolTaskExecutor多線程批量插入百萬(wàn)級(jí)數(shù)據(jù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Elasticsearch中store field與non-store field的區(qū)別說(shuō)明
這篇文章主要介紹了Elasticsearch中store field與non-store field的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot 整合Tess4J庫(kù)實(shí)現(xiàn)圖片文字識(shí)別案例詳解
Tess4J是一個(gè)基于Tesseract OCR引擎的Java接口,可以用來(lái)識(shí)別圖像中的文本,說(shuō)白了,就是封裝了它的API,讓Java可以直接調(diào)用,今天給大家分享一個(gè)SpringBoot整合Tess4j庫(kù)實(shí)現(xiàn)圖片文字識(shí)別的小案例2023-10-10