- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 教你怎么使用Optional處理null
相比做Java開(kāi)發(fā)的,見(jiàn)到NullPointerException
肯定不陌生吧,可以說(shuō)見(jiàn)到它深?lèi)和唇^。在開(kāi)發(fā)時(shí)認為不會(huì )出現NullPointerException
異常,最終到了生產(chǎn)環(huán)境,就給你來(lái)點(diǎn)意外驚喜。但是在開(kāi)發(fā)時(shí)處理對象為空的通常都是用if(null != xxx)
,或者使用一些工具類(lèi),比如:if(ObjectUtils.isEmpty(xxx))
,可以看出這種處理會(huì )讓我們的代碼變得很臃腫,遇到一個(gè)對象時(shí)可能都要這樣來(lái)一下。
使用Optional
類(lèi)就可以避免在程序中使用一堆的if
來(lái)處理空了。下表列出Optional
類(lèi)中的方法:
下面就一一來(lái)詳細使用上面列出的方法。
Optional<User> user = Optional.empty();
創(chuàng )建一個(gè)空的Optional
對象
User user = null; Optional<User> optional = Optional.of(user);
user
為空,直接報NullPointerException
異常,因此該方法一般很少用。
User user = null; Optional<User> optional = Optional.ofNullable(user);
user
為空,則返回空的Optional
對象
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.get();
從Optional
中獲取值,如果值不存在則拋出如下異常:java.util.NoSuchElementException: No value present
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.isPresent();
以上例子返回false
,如果user
不為空,則返回true
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.ifPresent(us->{ //user不為空,執行 });
User user = new User(); user.setName("小A"); boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();
如果用戶(hù)名為小A
,則返回true
,否則返回false
User user = new User(); user.setName("小A"); String name = Optional.ofNullable(user).map(User::getName).get();
如果user
不為空,則抽取name
屬性,使用get()
獲取。這里如果name
為空,則會(huì )報異常,因此通常都是指定默認值或使用自定義異常拋出。
String name = Optional.ofNullable(user).map(User::getName).orElse("");
或
String name = Optional.ofNullable(user) .map(User::getName) .orElseThrow(()->new RuntimeException("用戶(hù)名不能為空"));
該方法一般用于從類(lèi)中獲取其他類(lèi)的中某個(gè)屬性,比如一個(gè)班級里面有學(xué)生,學(xué)生里面有地址,現在需要獲取這個(gè)班級下的某個(gè)學(xué)生的地址,按之前的寫(xiě)法:
Address address = new Address(); address.setAddr("天河區"); 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()); } } }
為了程序不出問(wèn)題,就會(huì )寫(xiě)一大堆的if
來(lái)判斷,下面用flatMap
來(lái)看下怎么實(shí)現:
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("")
Optional.ofNullable(grade).orElse(new Grade());
Optional.ofNullable(grade).orElseGet(()->new Grade());
Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班級不能為空"));
以上Optional
類(lèi)的全部方法的使用都列出來(lái)了。
到此這篇關(guān)于教你怎么使用Optional處理null的文章就介紹到這了,更多相關(guān)Optional處理null內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站