Java8 教程第十五章之Optional 用法

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

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

引子

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

那么在java8 中:

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

Optional 基礎(chǔ)例子

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));

    }

輸出內(nèi)容

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對(duì)象非空,則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("不會(huì)報(bào)空指針"));
        //condition failed, no output print
        emptyGender.ifPresent(g -> System.out.println("不會(huì)報(bào)空指針"));
    }

輸出

Value available.
不會(huì)報(bào)空指針
空

Optional orElse 方法

解釋:如果在Optional Container中存在,則返回該值。否則返回給定的默認(rèn)值。

   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>

其實(shí)看到這里大家應(yīng)該看懂了吧, 其實(shí)就是一個(gè)if else的邏輯, 這樣看起來更清爽,而且會(huì)提示你讓你強(qiáng)制判斷空指針的問題,從而告別空指針.

歡迎留言討論

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容