Optional是Java8新引入的類別
這是一個可以為null的容器對象。如果值存在則isPresent()方法會傳回true,呼叫get()方法會傳回該物件。
java.lang.NullPointerException,只要敢自稱Java程式設計師,那對這個異常就再熟悉不過了。為了防止拋出這個異常,我們常常會寫出這樣的程式碼:
Person person = people.find("John Smith"); if (person != null) { person.doSomething(); }
遺憾的是,在絕大多數Java程式碼裡,我們常常忘記了判斷空引用,所以,NullPointerException便也隨之而來了。
“Null Sucks.”,這就是Doug Lea對空的評價。身為一個Java程式設計師,如果你還不知道Doug Lea是誰,那趕緊補課,沒有他的貢獻,我們還只能用Java最原始的裝備處理多執行緒。
"I call it my billion-dollar mistake.",有資格說這話是空引用的發明者,Sir C. A. R. Hoare。你可以不知道Doug Lea,但你一定要知道這位老人家,否則,你便沒資格使用快速排序。
在Java世界裡,解決空引用問題常見的一種方法是,使用Null Object模式。這樣的話,在「沒有什麼」的情況下,就回傳Null Object,客戶端程式碼就不用判斷是否為空了。但是,這種做法也有一些問題。首先,我們肯定要為Null Object編寫程式碼,而且,如果我們想大規模地應用這個模式,我們要為幾乎每個類別編寫Null Object。
幸好,我們還有另一個選擇:Optional。 Optional是對可以為空的物件進行的封裝,它實現起來並不復雜。在某些語言裡,例如Scala,Optional實作成了語言的一部分。而對於Java程式設計師而言,Guava為我們提供了Optional的支援。閒言少敘,先來如何使用Optional,完成前面的那段程式碼。
Optional person = people.find("John Smith"); if (person.isPresent()) { person.get().doSomething(); }
這裡如果isPresent()回傳false,表示這是個空對象,否則,我們就可以把其中的內容取出來做自己想做的操作了。
如果你期待的是程式碼量的減少,恐怕這裡要讓你失望了。單從程式碼量上來說,Optional甚至比原來的程式碼還多。但好處在於,你絕對不會忘記判空,因為這裡我們得到的不是Person類的對象,而是Optional。
以下是個人練習的程式碼
public class OptionalTest { /** * of后面接给optional设置的值 但是不能为空 如果为空会报空指针异常 * @Title: ofTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ofTest() { Optional<String> optional = Optional.of("123"); System.out.println(optional.get()); try { optional = Optional.of(null); System.out.println(optional.get()); //get方法是获取optional的值 类型取决于声明的时候 }catch(NullPointerException e) { System.out.println("空指针异常"); } } /** * ofNullable 和of类似 但是ofNullable可以设置null值 如果是Null值得话取值会报NoSuchElementException 异常 * @Title: ofNullableTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ofNullableTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.get()); try { optional = Optional.ofNullable(null); System.out.println(optional.get()); }catch(NoSuchElementException e) { System.out.println("NoSuchElementException 异常"); } } /** * ifPresent用来判断optional中有没有值存在 如果有则为真 * @Title: isPresentTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void isPresentTest() { Optional<String> optional = Optional.ofNullable(null); if(optional.isPresent()) { System.out.println(optional.get()); } else { System.out.println("值为空"); } } /** * ifPresent和isPresent类似 只不过它支持λ表达式 * @Title: ifPresentTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void ifPresentTest() { Optional<String> optional = Optional.ofNullable("123"); optional.ifPresent(var ->{ System.out.println(var); }); } /** * orElse方法,如果值为空的话会用参数中的值去替换 即设置默认值 * @Title: orElseTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void orElseTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.orElse("有没有")); optional = Optional.ofNullable(null); System.out.println(optional.orElse("有没有")); } /** * orElseGet方法 和orElse类似 不过此方法接受Supplier接口的实现用来生成默认值 * @Title: orElseGetTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void orElseGetTest() { Optional<String> optional = Optional.ofNullable("123"); System.out.println(optional.orElseGet(()->"123456")); optional = Optional.ofNullable(null); System.out.println(optional.orElseGet(()->"123456")); } /** * map方法 如果有值则会对值进行mapping中的处理 处理结果存在则创建并返回Optional类型的结果 否则返回空 * @Title: mapTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void mapTest() { Optional<String> optional = Optional.ofNullable("abc"); System.out.println(optional.map(var->var.toUpperCase()).get()); } /** * flatMap和map类似 只不过mapping中必须返回Option类型的数据 * @Title: flatMapTest * @Description: TODO * @param: * @return: void * @throws */ // @Test public void flatMapTest() { Optional<String> optional = Optional.ofNullable("abc"); System.out.println(optional.flatMap(var->Optional.of(var.toUpperCase())).get()); } /** * filter对optional进行过滤,mapping中为过滤的条件 如果不满足条件 返回一个为空的Optional * @Title: filterTest * @Description: TODO * @param: * @return: void * @throws */ @Test public void filterTest() { try { Optional<String> optional = Optional.ofNullable("一二三四五六七八"); System.out.println(optional.filter(var ->var.length()>6).get()); System.out.println(optional.filter(var ->var.length()<6).get()); }catch(NoSuchElementException e) { System.out.println("optional的值为空"); } }
【相關推薦】
#1. Java 8新增的API--Optional 的使用實例
以上是分享Java8中新引入的類別Optional實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!