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

1.背景

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

2.Optional的基本使用

  • of() 為非null的值創(chuàng)建一個(gè)Optional
    注意:如果傳入?yún)?shù)為null想幻,則拋出NullPointerException 。
  • ofNullable() 為指定的值創(chuàng)建一個(gè)Optional话浇,如果指定的值為null脏毯,則返回一個(gè)空的Optional。
    注意: 可以接受參數(shù)為null幔崖,區(qū)別于 of() 食店。
//of 為非null的值創(chuàng)建一個(gè)Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null赏寇,則返回一個(gè)空的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 如果有值自娩,則對(duì)其執(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é)束時(shí)旱眯,flatMap不會(huì)對(duì)結(jié)果用Optional封裝
    Optional<String> filter = cap.filter(s->s.length()<6);
    System.out.println(filter);

3.總結(jié)

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

import java.util.Optional;

public class Optional_Demo {
    public static void main(String[] args) {
        //of 為非null的值創(chuàng)建一個(gè)Optional
        Optional<String> opt_full = Optional.of("helloworld");
        //ofNullable() 為指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null蓬蝶,則返回一個(gè)空的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 如果有值缓窜,則對(duì)其執(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é)束時(shí)黄娘,flatMap不會(huì)對(duì)結(jié)果用Optional封裝
        Optional<String> filter = cap.filter(s->s.length()<6);
        System.out.println(filter);
    }
  }
運(yùn)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峭状,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逼争,更是在濱河造成了極大的恐慌优床,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮凝,死亡現(xiàn)場(chǎng)離奇詭異羔巢,居然都是意外死亡望忆,警方通過(guò)查閱死者的電腦和手機(jī)罩阵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)启摄,“玉大人稿壁,你說(shuō)我怎么就攤上這事∏副福” “怎么了傅是?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喧笔,道長(zhǎng)帽驯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任书闸,我火速辦了婚禮尼变,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浆劲。我一直安慰自己嫌术,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布牌借。 她就那樣靜靜地躺著度气,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膨报。 梳的紋絲不亂的頭發(fā)上磷籍,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音丙躏,去河邊找鬼择示。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晒旅,可吹牛的內(nèi)容都是我干的栅盲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼废恋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谈秫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鱼鼓,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拟烫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迄本,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體硕淑,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘉赎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了置媳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡公条,死狀恐怖拇囊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靶橱,我是刑警寧澤寥袭,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布路捧,位于F島的核電站,受9級(jí)特大地震影響传黄,放射性物質(zhì)發(fā)生泄漏杰扫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一膘掰、第九天 我趴在偏房一處隱蔽的房頂上張望涉波。 院中可真熱鬧,春花似錦炭序、人聲如沸啤覆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窗声。三九已至,卻和暖如春辜纲,著一層夾襖步出監(jiān)牢的瞬間笨觅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工耕腾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见剩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓扫俺,卻偏偏與公主長(zhǎng)得像苍苞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狼纬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

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