Java8學習筆記(三)—— Optional類的使用

Java8學習筆記系列:

Java8學習筆記(一)—— 函數式編程的四個基本接口

Java8學習筆記(二)—— Lambda表達式

Java8學習筆記(三)—— Optional類的使用

Java8學習筆記(四) —— Stream流式編程

Java8學習筆記(五)—— 方法引用(::雙冒號操作符)

一、Optional類的作用

        Optional類的作用主要是爲了解決空指針問題,通過對結果的包裝,並使用方法來代替if判斷,爲流式編程打下了良好的基礎。

二、Optional類的初始化

/**
     * Optional的初始化
     * Optional的構造方法是私有的,所有隻能通過靜態方法去初始化
     */
    @Test
    public void example1(){
        //of 爲指定的類型值創建一個Optional,如果給定的值爲null則會報空指針異常
        Optional<String> optional = Optional.of("Hello Optional");
        System.out.println(optional.get()); //打印:Hello Optional

        //ofNullable 爲指定的類型值創建一個Optional,它與of的區別在於可以傳null,當值爲null時則創建一個空的Optional
        Optional<Object> o = Optional.ofNullable(null);
        System.out.println(o instanceof Optional); //打印:true

        //empty 獲取Optional的靜態初始化空對象,單例實現,全局唯一
        Optional<Object> empty = Optional.empty();
        System.out.println(o == empty); //打印:true
    }

三、Optional類的API使用示例

/**
     * Optional的isPresent方法:如果值存在返回true,否則返回false
     */
    @Test
    public void example2(){
        Optional<Object> o = Optional.ofNullable(null);
        System.out.println(o.isPresent()); //打印:false

        Optional<String> optional = Optional.ofNullable("Hello Optional");
        System.out.println(optional.isPresent()); //打印:true
    }

    /**
     * Optional的get方法:如果值存在則返回,否則拋出NoSuchElementException異常
     */
    @Test
    public void example3(){
        Optional<String> optional = Optional.ofNullable("Hello Optional");
        System.out.println(optional.get()); //打印:Hello Optional

        Optional<Object> o = Optional.ofNullable(null);
        System.out.println(o.get()); //拋出:NoSuchElementException異常
    }

    /**
     * Optional的ifPresent方法:如果有值則調用Consumer,否則不做處理
     */
    @Test
    public void example4(){
        Optional<String> optional = Optional.ofNullable("Hello Optional");
        optional.ifPresent(x -> System.out.println(x)); //簡化前
        optional.ifPresent(System.out::println); //簡化後
        optional.ifPresent(this::doSomething); //自定義
        //打印結果均爲:Hello Optional
    }
    private void doSomething(String s){
        System.out.println(s);
    }

    /**
     * Optional的orElse方法:如果有值則返回,否則返回其他指定的值
     */
    @Test
    public void example5(){
        System.out.println(Optional.empty().orElse("備胎")); //打印:備胎
        System.out.println(Optional.of("張三").orElse("備胎")); //打印:張三
    }

    /**
     * Optional的orElseGet方法:如果有值則返回值,否則返回supplier的接口實現生成默認值
     */
    @Test
    public void example6(){
        System.out.println(Optional.empty().orElseGet(() -> "備胎")); //打印:備胎
        System.out.println(Optional.of("張三").orElseGet(() -> "備胎")); //打印:張三
    }

    /**
     * Optional的orElseThrow方法:如果沒有值則拋出一個異常
     */
    @Test
    public void example7(){
        try {
            System.out.println(Optional.empty().orElseThrow(() -> new Exception("操作異常")));
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }

    /**
     * Optional的map方法:
     * 傳入參數mapper如果爲null,則拋出空指針異常。
     * mapper不爲空則檢查Optional是否爲空,爲空則返回空Optional
     * Optional不爲空時則執行mapper參數的function方法得到mapper返回值
     * mapper返回值爲空則返回空Optional,否則創建包含mapper返回值的Optional進行返回
     *
     * 與之類似的是flatMap方法:它與map的區別是mapper的返回值必須爲Optional,
     * 調用結束時不會再對mapper返回值進行Optional封裝
     */
    @Test
    public void example8(){
        //map
        Optional<String> optional = Optional.ofNullable(100)
                .map(fun1 -> fun1.toString())
                .map( x -> x + "100");
        System.out.println(optional.orElse("default")); //打印:100100

        //flatMap
        Optional<String> optional1 = Optional.ofNullable(100)
                .flatMap(z -> Optional.ofNullable(z.toString()))
                .flatMap(t -> Optional.ofNullable(t + "100"));
        System.out.println(optional1.orElse("default")); //打印:100100
    }

    /**
     * Optional的filter方法:
     * 如果有值並且滿足斷言條件則返回包含該值的Optional,否則返回空的Optional
     */
    @Test
    public void example9(){
        Optional<String> optional1 = Optional.ofNullable("test")
                .filter(s -> s.equals("test"));
        System.out.println(optional1.isPresent()); //打印:true

        Optional<String> optional2 = Optional.ofNullable("test")
                .filter(s -> s.equals("test"))
                .filter(t -> t.length() > 5);
        System.out.println(optional2.isPresent()); //打印:false
    }

參考:

1、java8 -函數式編程之Optional

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章