教你怎么使用Optional處理null
一、聊聊NullPointerException
相比做Java開發(fā)的,見到NullPointerException肯定不陌生吧,可以說見到它深惡痛絕。在開發(fā)時認為不會出現NullPointerException異常,最終到了生產環(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í)行使用該值的方法調用,否則什么都不做 |
| filter | 如果值存在并且滿足提供的謂詞,就返回包含該值的Optional對象,否則返回空的Optional對象 |
| map | 如果值存在,就對該值執(zhí)行提供的mapping函數調用 |
| flatMap | 如果值存在,就對該值執(zhí)行提供的mapping函數調用,返回一個Optional類型的值,否則就返回一個空的Optional對象 |
| orElse | 如果值存在就將其返回,否則返回指定的的值 |
| orElseGet | 如果值存在就將其返回,否則返回由指定的Supplier接口生成的值 |
| orElseThrow | 如果值存在就將其返回,否則拋出由指定的Supplier接口生成的異常 |
下面就一一來詳細使用上面列出的方法。
二、使用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為空,則會報異常,因此通常都是指定默認值或使用自定義異常拋出。
String name = Optional.ofNullable(user).map(User::getName).orElse("");
或
String name = Optional.ofNullable(user)
.map(User::getName)
.orElseThrow(()->new RuntimeException("用戶名不能為空"));
2.9 flatMap
該方法一般用于從類中獲取其他類的中某個屬性,比如一個班級里面有學生,學生里面有地址,現在需要獲取這個班級下的某個學生的地址,按之前的寫法:
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來看下怎么實現:
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類的全部方法的使用都列出來了。
到此這篇關于教你怎么使用Optional處理null的文章就介紹到這了,更多相關Optional處理null內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java concurrency集合之ConcurrentLinkedQueue_動力節(jié)點Java學院整理
這篇文章主要介紹了Java concurrency集合之ConcurrentLinkedQueue,需要的朋友可以參考下2017-06-06
Java開發(fā)之普通web項目轉為Maven項目的方法
這篇文章主要給大家介紹了關于Java開發(fā)之普通web項目轉為Maven項目的相關資料,文中通過圖文將轉換的方法步驟介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-12-12
基于java中stack與heap的區(qū)別,java中的垃圾回收機制的相關介紹
本篇文章小編將為大家介紹,基于java中stack與heap的區(qū)別,java中的垃圾回收機制的相關介紹,需要的可以參考一下2013-04-04
Spring Cloud LoadBalancer 負載均衡詳解
本文介紹了如何在Spring Cloud中使用SpringCloudLoadBalancer實現客戶端負載均衡,并詳細講解了輪詢策略和隨機策略的配置方法,此外,還提供了部署到云服務器并在多個實例之間進行負載均衡的步驟,感興趣的朋友一起看看吧2025-02-02

