01 Java8新特性解析筆記 Optional類--空值異常的助手

1.背景

調(diào)用一個方法得到了返回值卻不能直接將返回值作為參數(shù)去調(diào)用別的方法。我們首先要判斷這個返回值是否為null,只有在非空的前提下才能將其作為其他方法的參數(shù);否則的會出現(xiàn)空值異常。
據(jù)說在,Java8以前,Google Guava引入了Optionals類來解決NullPointerException,從而避免源碼被各種null檢查污染,以便開發(fā)者寫出更加整潔的代碼。Java 8也將Optional加入了官方庫。

2.Optional的基本使用

  • of() 為非null的值創(chuàng)建一個Optional
    注意:如果傳入?yún)?shù)為null,則拋出NullPointerException 。
  • ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
    注意: 可以接受參數(shù)為null,區(qū)別于 of() 。
//of 為非null的值創(chuàng)建一個Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
Optional<String> opt_empty = Optional.ofNullable(null);
  • isPresent() 如果值存在返回true,否則返回false
    System.out.println("opt_full:"+opt_full.isPresent());
    System.out.println("opt_empty:"+opt_empty.isPresent());
  • full.get() 如果Optional有值則將其返回,否則拋出NoSuchElementException *
if(opt_full.isPresent()){
      System.out.println("opt_full的內(nèi)容:"+opt_full.get());
}
  • map 如果有值,則對其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional
    Optional<String> cap = opt_full.map(s->s.toUpperCase());
    System.out.println(cap.get());
  • filter(),為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回值必須是Optional。調(diào)用結(jié)束時,flatMap不會對結(jié)果用Optional封裝
    Optional<String> filter = cap.filter(s->s.length()<6);
    System.out.println(filter);

3.總結(jié)

Optional類的提供一些便利的方法和lambda表達(dá)式使得,在做程序判空時,十分便利,本文只是對optional的方法簡要使用Demo。最后匯總待碼如下,實(shí)在時太簡單了,就不放在github了。
補(bǔ)充知識連接:

import java.util.Optional;

public class Optional_Demo {
    public static void main(String[] args) {
        //of 為非null的值創(chuàng)建一個Optional
        Optional<String> opt_full = Optional.of("helloworld");
        //ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
        Optional<String> opt_empty = Optional.ofNullable(null);
        
        //isPresent() 如果值存在返回true,否則返回false
        System.out.println("opt_full:"+opt_full.isPresent());
        System.out.println("opt_empty:"+opt_empty.isPresent());
        
        //full.get() 如果Optional有值則將其返回,否則拋出NoSuchElementException
        if(opt_full.isPresent()){
            System.out.println("opt_full的內(nèi)容:"+opt_full.get());
        }
        //orElse() 如果有值則將其返回,否則返回指定的其它值。
        System.out.println(opt_full.orElse("試圖修改內(nèi)容"));
        System.out.println(opt_empty.orElse("試圖修改內(nèi)容"));
        
        //map 如果有值,則對其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional
        Optional<String> cap = opt_full.map(s->s.toUpperCase());
        System.out.println(cap.get());
        
        //如果有值,為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回值必須是Optional。調(diào)用結(jié)束時,flatMap不會對結(jié)果用Optional封裝
        Optional<String> filter = cap.filter(s->s.length()<6);
        System.out.println(filter);
    }
  }
運(yùn)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本。Java 8 為Java語言、編譯器、類庫、開發(fā)...
    誰在烽煙彼岸閱讀 910評論 0 4
  • Nothing is imposible for a willing heart. Java 8 (又稱為 jdk...
    北緯26閱讀 1,052評論 1 6
  • 原鏈接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把愛放下會走更遠(yuǎn)閱讀 1,127評論 0 10
  • 一.函數(shù)式接口 函數(shù)式接口,就是一個接口里面只有一個接口,接口上都用@FunctionalInterface注釋修...
    豪大大大閱讀 395評論 0 0