Java8 教程第十五章之Optional 用法

本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對的地方還請多多包涵。

本節(jié)課先簡單的介紹下Java8有哪些新特性,對于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.

引子

Java 8在java.util包中引入了一個新類Optional诚纸。 它用于表示存在或不存在的值。 這個新構造的主要優(yōu)點是沒有太多的空檢查和NullPointerException谢揪。 它避免了任何運行時NullPointerExceptions,并支持我們開發(fā)干凈整潔的Java API或應用程序捐凭。 與集合和數(shù)組一樣,它也是一個容納最多一個值的容器凳鬓。 讓我們用一些有用的例子來探索這個新的構造茁肠。

那么在java8 中:

  • 需要空檢查
  • 在運行時不再有NullPointerException
  • 我們可以開發(fā)干凈整潔的API

Optional 基礎例子

public static void main(String[] args) {

        Optional<String> gender = Optional.of("MALE");
        String answer1 = "Yes";
        String answer2 = null;

        System.out.println("Non-Empty Optional:" + gender);
        System.out.println("Non-Empty Optional: Gender value : " + gender.get());
        System.out.println("Empty Optional: " + Optional.empty());

        System.out.println("ofNullable on Non-Empty Optional: " + Optional.ofNullable(answer1));
        System.out.println("ofNullable on Empty Optional: " + Optional.ofNullable(answer2));

        // java.lang.NullPointerException
        System.out.println("ofNullable on Non-Empty Optional: " + Optional.of(answer2));

    }

輸出內容

Non-Empty Optional:Optional[MALE]
Non-Empty Optional: Gender value : MALE
Empty Optional: Optional.empty
ofNullable on Non-Empty Optional: Optional[Yes]
ofNullable on Empty Optional: Optional.empty
Exception in thread "main" java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at java.util.Optional.<init>(Optional.java:96)
    at java.util.Optional.of(Optional.java:108)
    at Java82.main(Java82.java:30)

Optional的map和flatMap用法

public static void main(String[] args) {
        Optional<String> nonEmptyGender = Optional.of("male");
        Optional<String> emptyGender = Optional.empty();
        System.out.println("不為空 Optional:: " + nonEmptyGender.map(String::toUpperCase));
        System.out.println("空 Optional    :: " + emptyGender.map(String::toUpperCase));

        Optional<Optional<String>> nonEmptyOtionalGender = Optional.of(Optional.of("male"));
        System.out.println("Optional value   :: " + nonEmptyOtionalGender);
        System.out.println("Optional.map     :: " + nonEmptyOtionalGender.map(gender -> gender.map(String::toUpperCase)));
        System.out.println("Optional.flatMap :: " + nonEmptyOtionalGender.flatMap(gender -> gender.map(String::toUpperCase)));
    }

輸出

不為空 Optional:: Optional[MALE]
空 Optional    :: Optional.empty
Optional value   :: Optional[Optional[male]]
Optional.map     :: Optional[Optional[MALE]]
Optional.flatMap :: Optional[MALE]

Optional filter用法

 public static void main(String[] args) {
        Optional<String> gender = Optional.of("MALE");
        Optional<String> emptyGender = Optional.empty();
        //Filter on Optional
        System.out.println(gender.filter(g -> g.equals("male"))); //Optional.empty
        System.out.println(gender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional[MALE]
        System.out.println(emptyGender.filter(g -> g.equalsIgnoreCase("MALE"))); //Optional.empty
    }

輸出

Optional.empty
Optional[MALE]
Optional.empty

Optional 中 isPresent 和 ifPresent的用法

如果給定的Optional對象非空,則Optional.isPresent()返回true缩举。否則返回false

public static void main(String[] args) {

        Optional<String> gender = Optional.of("MALE");
        Optional<String> emptyGender = Optional.empty();
        if (gender.isPresent()) {
            System.out.println("Value available.");
        } else {
            System.out.println("Value not available.");
        }
        gender.ifPresent(g -> System.out.println("不會報空指針"));
        //condition failed, no output print
        emptyGender.ifPresent(g -> System.out.println("不會報空指針"));
    }

輸出

Value available.
不會報空指針
空

Optional orElse 方法

解釋:如果在Optional Container中存在垦梆,則返回該值。否則返回給定的默認值仅孩。

   public static void main(String[] args) {

        Optional<String> gender = Optional.of("梁思前");
        Optional<String> emptyGender = Optional.empty();

        System.out.println(gender.orElse("<N/A>")); //梁思前
        System.out.println(emptyGender.orElse("<N/A>")); //<N/A>

        System.out.println(gender.orElseGet(() -> "<N/A>")); //梁思前
        System.out.println(emptyGender.orElseGet(() -> "<N/A>")); //<N/A>

    }

輸出

梁思前
<N/A>
梁思前
<N/A>

其實看到這里大家應該看懂了吧, 其實就是一個if else的邏輯, 這樣看起來更清爽,而且會提示你讓你強制判斷空指針的問題,從而告別空指針.

歡迎留言討論

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末托猩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辽慕,更是在濱河造成了極大的恐慌吐辙,老刑警劉巖茉继,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡屁商,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蔬螟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职辨,“玉大人,你說我怎么就攤上這事镜撩≡て猓” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宜鸯。 經常有香客問我憔古,道長,這世上最難降的妖魔是什么顾翼? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任投放,我火速辦了婚禮,結果婚禮上适贸,老公的妹妹穿的比我還像新娘灸芳。我一直安慰自己,他們只是感情好拜姿,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布烙样。 她就那樣靜靜地躺著,像睡著了一般蕊肥。 火紅的嫁衣襯著肌膚如雪谒获。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天壁却,我揣著相機與錄音批狱,去河邊找鬼。 笑死展东,一個胖子當著我的面吹牛赔硫,可吹牛的內容都是我干的。 我是一名探鬼主播盐肃,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼爪膊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砸王?” 一聲冷哼從身側響起推盛,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谦铃,沒想到半個月后耘成,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡荷辕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年凿跳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疮方。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡控嗜,死狀恐怖,靈堂內的尸體忽然破棺而出骡显,到底是詐尸還是另有隱情疆栏,我是刑警寧澤曾掂,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站壁顶,受9級特大地震影響珠洗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜若专,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一许蓖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧调衰,春花似錦膊爪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趋箩,卻和暖如春赃额,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叫确。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工跳芳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竹勉。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓筛严,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饶米。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容