教你怎么使用Optional處理null
一、聊聊NullPointerException
相比做Java開發(fā)的,見到NullPointerException
肯定不陌生吧,可以說見到它深惡痛絕。在開發(fā)時認(rèn)為不會出現(xiàn)NullPointerException
異常,最終到了生產(chǎn)環(huán)境,就給你來點意外驚喜。但是在開發(fā)時處理對象為空的通常都是用if(null != xxx)
,或者使用一些工具類,比如:if(ObjectUtils.isEmpty(xxx))
,可以看出這種處理會讓我們的代碼變得很臃腫,遇到一個對象時可能都要這樣來一下。
使用Optional
類就可以避免在程序中使用一堆的if
來處理空了。下表列出Optional
類中的方法:
方法名 | 描述 |
empty | 返回一個空的Optional 實例 |
of | 將指定值用Optional 封裝后返回,如果值為null ,則拋出NullPointerException 異常 |
ofNullable | 將指定值用Optional 封裝后返回,如果值為null ,則返回空的Optional 對象 |
get | 如果值存在,則返回該值,否則拋出NullPointerException 異常 |
isPresent | 檢查值是否存在,存在返回true ,否則返回false |
ifPresent | 如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么都不做 |
filter | 如果值存在并且滿足提供的謂詞,就返回包含該值的Optional 對象,否則返回空的Optional 對象 |
map | 如果值存在,就對該值執(zhí)行提供的mapping 函數(shù)調(diào)用 |
flatMap | 如果值存在,就對該值執(zhí)行提供的mapping 函數(shù)調(diào)用,返回一個Optional 類型的值,否則就返回一個空的Optional 對象 |
orElse | 如果值存在就將其返回,否則返回指定的的值 |
orElseGet | 如果值存在就將其返回,否則返回由指定的Supplier 接口生成的值 |
orElseThrow | 如果值存在就將其返回,否則拋出由指定的Supplier 接口生成的異常 |
下面就一一來詳細(xì)使用上面列出的方法。
二、使用Optional類
2.1 empty
Optional<User> user = Optional.empty();
創(chuàng)建一個空的Optional
對象
2.2 of
User user = null; Optional<User> optional = Optional.of(user);
user
為空,直接報NullPointerException
異常,因此該方法一般很少用。
2.3 ofNullable
User user = null; Optional<User> optional = Optional.ofNullable(user);
user
為空,則返回空的Optional
對象
2.4 get
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.get();
從Optional
中獲取值,如果值不存在則拋出如下異常:java.util.NoSuchElementException: No value present
2.5 isPresent
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.isPresent();
以上例子返回false
,如果user
不為空,則返回true
2.6 ifPresent
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.ifPresent(us->{ //user不為空,執(zhí)行 });
2.7 filter
User user = new User(); user.setName("小A"); boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();
如果用戶名為小A
,則返回true
,否則返回false
2.8 map
User user = new User(); user.setName("小A"); String name = Optional.ofNullable(user).map(User::getName).get();
如果user
不為空,則抽取name
屬性,使用get()
獲取。這里如果name
為空,則會報異常,因此通常都是指定默認(rèn)值或使用自定義異常拋出。
String name = Optional.ofNullable(user).map(User::getName).orElse("");
或
String name = Optional.ofNullable(user) .map(User::getName) .orElseThrow(()->new RuntimeException("用戶名不能為空"));
2.9 flatMap
該方法一般用于從類中獲取其他類的中某個屬性,比如一個班級里面有學(xué)生,學(xué)生里面有地址,現(xiàn)在需要獲取這個班級下的某個學(xué)生的地址,按之前的寫法:
Address address = new Address(); address.setAddr("天河區(qū)"); Student student = new Student(); student.setName("小A"); student.setAddress(address); Grade grade = new Grade(); grade.setName("三年級2班"); grade.setStudent(student); if(!ObjectUtils.isEmpty(grade)){ Student student1 = grade.getStudent(); if(!ObjectUtils.isEmpty(student1)){ Address address1 = student1.getAddress(); if(!ObjectUtils.isEmpty(address1)){ System.out.println(address1.getAddr()); } } }
為了程序不出問題,就會寫一大堆的if
來判斷,下面用flatMap
來看下怎么實現(xiàn):
Optional.ofNullable(grade) .flatMap(g->Optional.ofNullable(g.getStudent())) .flatMap(s->Optional.ofNullable(s.getAddress())) .map(Address::getAddr) .orElse("")
或
Optional.ofNullable(grade) .map(Grade::getStudent) .map(Student::getAddress) .map(Address::getAddr) .orElse("")
2.10 orElse
Optional.ofNullable(grade).orElse(new Grade());
2.11 orElseGet
Optional.ofNullable(grade).orElseGet(()->new Grade());
2.12 orElseThrow
Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班級不能為空"));
以上Optional
類的全部方法的使用都列出來了。
到此這篇關(guān)于教你怎么使用Optional處理null的文章就介紹到這了,更多相關(guān)Optional處理null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于JDK15的新特性之TextBlocks文本塊的引入和使用
這篇文章主要介紹了關(guān)于JDK15的新特性之文本塊的引入和使用,如果具有一種語言學(xué)機制,可以比多行文字更直觀地表示字符串,而且可以跨越多行,而且不會出現(xiàn)轉(zhuǎn)義的視覺混亂,那么這將提高廣泛Java類程序的可讀性和可寫性,需要的朋友可以參考下2023-07-07java調(diào)用中國天氣網(wǎng)api獲得天氣預(yù)報信息的方法
這篇文章主要介紹了java調(diào)用中國天氣網(wǎng)api獲得天氣預(yù)報信息的方法,可實現(xiàn)調(diào)用溫度、風(fēng)力風(fēng)向及近期天氣狀況等功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07SpringBoot基于Mybatis攔截器和JSqlParser實現(xiàn)數(shù)據(jù)隔離
本文將介紹如何在 Spring Boot 項目中利用Mybatis的強大攔截器機制結(jié)合JSqlParser,一個功能豐富的 SQL 解析器,來輕松實現(xiàn)數(shù)據(jù)隔離的目標(biāo),本文根據(jù)示例展示如何根據(jù)當(dāng)前的運行環(huán)境來實現(xiàn)數(shù)據(jù)隔離,需要的朋友可以參考下2024-04-04通過AOP攔截Spring?Boot日志并將其存入數(shù)據(jù)庫功能實現(xiàn)
本文介紹了如何使用Spring Boot和AOP技術(shù)實現(xiàn)攔截系統(tǒng)日志并保存到數(shù)據(jù)庫中的功能,包括配置數(shù)據(jù)庫連接、定義日志實體類、定義日志攔截器、使用AOP攔截日志并保存到數(shù)據(jù)庫中等步驟,感興趣的朋友一起看看吧2023-08-08SpringBoot3和ShardingSphere5框架實現(xiàn)數(shù)據(jù)分庫分表
這篇文章主要介紹了SpringBoot3和ShardingSphere5框架實現(xiàn)數(shù)據(jù)分庫分表的相關(guān)資料,需要的朋友可以參考下2023-08-08利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery)
這篇文章主要介紹了利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10MyBatis limit分頁設(shè)置的實現(xiàn)
這篇文章主要介紹了MyBatis limit分頁設(shè)置的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04