在Java應用程序中,空指針異常是導致程序失敗的最常見原因之一。為了更加優雅地處理空指針異常,Java8引入了Optional類庫。Optional實際上是一個容器,可以保存類型T的值,或者僅僅保存null。通過使用Optional,我們能夠避免顯式進行空值檢測,使代碼更加清晰和健壯。
Optional 類(java.util.Optional) 是一個容器類,它可以保存類型T的值,代表這個值存在。或者僅僅保存null,表示這個值不存在。原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。并且可以避免空指針異常。
Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Java8提供了兩種方式來創建Optional對象:
// 參數不能是nullOptional optional1 = Optional.of(1);// ofNullable參數可以是nullOptional optional2 = Optional.ofNullable(null);// ofNullable參數也可以不是nullOptional optional3 = Optional.ofNullable(2);
使用isPresent()方法可以判斷Optional對象中的值是否存在。
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);System.out.println(optional1.isPresent()); // trueSystem.out.println(optional2.isPresent()); // false
ifPresent(Consumer consumer)方法,可以在Optional對象保存的值不為null時執行指定的操作
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);// 如果不是null,調用Consumeroptional1.ifPresent(value -> System.out.println("value is " + value));// null,不調用Consumeroptional2.ifPresent(value -> System.out.println("value is " + value));
輸出結果:
value is 1
orElse(value)方法,可以在Optional對象保存的值不為null時返回原來的值,否則返回指定的默認值
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);System.out.println(optional1.orElse(1000)); // 1System.out.println(optional2.orElse(1000)); // 1000
orElseThrow()方法可以在值不存在時拋出異常,存在時什么都不做,類似于Guava的Precoditions
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);optional1.orElseThrow(() -> new IllegalStateException());try { optional2.orElseThrow(() -> new IllegalStateException());} catch (IllegalStateException e) { e.printStackTrace();}
Optional類還提供了filter(Predicate)和map(Function)方法,用于對Optional對象中保存的值進行過濾和映射
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);Optional<Integer> filter1 = optional1.filter(a -> a == null);Optional<Integer> filter2 = optional1.filter(a -> a == 1);Optional<Integer> filter3 = optional2.filter(a -> a == null);System.out.println(filter1.isPresent()); // falseSystem.out.println(filter2.isPresent()); // trueSystem.out.println(filter2.get().intValue() == 1); // trueSystem.out.println(filter3.isPresent()); // falseOptional<String> str1Optional = optional1.map(a -> "key" + a);Optional<String> str2Optional = optional2.map(a -> "key" + a);System.out.println(str1Optional.get()); // key1System.out.println(str2Optional.isPresent()); // false
flatMap()方法與map()相似,不同之處在于flatMap()的mapping函數返回值必須是Optional類型
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Optional<String>> str1Optional = optional1.map(a -> Optional.of("key" + a));Optional<String> str2Optional = optional1.flatMap(a -> Optional.of("key" + a));System.out.println(str1Optional.get().get()); // key1System.out.println(str2Optional.get()); // key1
方法 | 描述 |
empty | 返回一個空的 Optional 實例 |
of | 將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個 NullPointerException 異常 |
ofNullable | 將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個空的 Optional 對象 |
orElse | 如果有值則將其返回,否則返回一個默認值 |
orElseThrow | 如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常 |
filter | 如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對象;否則返回一個空的 Optional 對象 |
map | 如果值存在,就對該值執行提供的 mapping 函數調用 |
flatMap | 如果值存在,就對該值執行提供的 mapping 函數調用,返回一個 Optional 類型的值,否則就返 回一個空的 Optional 對象 |
本文鏈接:http://www.www897cc.com/showinfo-26-70386-0.htmlOptional類的使用指南:解決空指針異常
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 因天氣情況,申通快遞對發往 12 省份快件提價:3 公斤以上每公斤漲 1-3 元
下一篇: 一文了解this指針的奧秘