Jdk1.8新特性學習(Optional)

想必大家已經在使用jdk1.8做項目開發(fā),但是你對于它里面的一些性特性了解多少呢?有沒有在你的項目中運用呢?現在就和我來一起梳理一下吧。

介紹

它是java.util包下的一個類,是一個包裹對象的容器,它可以包裹null或非null的對象。如果你要獲取容器中的對象,需要使用get()方法。它的出現是為我們解決空指針異常的,以前我們寫代碼如果不進行if判斷,會經常出現異常?,F在有了他就會很優(yōu)雅。因為它本身就是個對象,不管放進去的對象為不為null,始終不會返回null,所以你也不需要在你的業(yè)務流程中進行一大堆的判斷,避免了程序運行時的空指針異常。

實例化Optional

  • Optional.of()
    不允許包裹為null的對象,否則程序報錯。
package com.example.demo.jdk;

import java.util.Optional;

/**
 * The class OptionalStudy
 */
public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        
        Optional op = Optional.of(null); //此處會報錯
        System.out.println(op);
    }

}
  • Optional.ofNullable()
    允許包裹對象為nul,為null時返回empty Optional
public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        
        Optional op = Optional.ofNullable(null);
        System.out.println(op);
    }

}

注意:當使用get()獲取容器中的對象時,如果對象為null,會有java.util.NoSuchElementException異常。所以最好先進行isPresent()判斷,如果返回true,說明存在,然后再獲取。

主要方法調用

1.empty()

返回empty的Optional實例,用的較少

2.equals(Object obj)

判斷兩個Optional是否相等,主要是所包裹的對象是否相等

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional op1 = Optional.of("hell");
        Optional op2 = Optional.ofNullable("hello");
        System.out.println(op1.equals(op2));
    }

}

輸出false,如果op1 也為hello則輸出true

3.filter(Predicate<? super T> predicate)

如果值存在并且滿足斷言,則返回滿足條件的Optional,否則返回empty。經常用來做過濾。

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.of("jack");
        Optional res = op.filter((name)-> name.length()>6);
        System.out.println(res);
    }

}

輸出empty

4.map(Function<? super T,? extends U> mapper)

如果值存在則對其進行mapping函數操作,如果mappping結果不為空則返回Optional,否則返回empty。

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.of("jack");
        Optional res = op.map((name) -> "hello,"+name);
        System.out.println(res);
    }

}

輸出hello,jack

5.flatMap(Function<? super T,Optional<U>> mapper)

功能類似map,只不過需要在mapping函數中,自己封裝成Optional。

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.of("jack");
        Optional res = op.flatMap((name) -> Optional.ofNullable("hello,"+name));
        System.out.println(res);
    }

}

6. orElse(T other)

值存在則返回,否則返回其它值。相當于給默認值。

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.ofNullable(null);
        System.out.println(op.orElse("other"));
    }

}

輸出other。

7. orElseGet(Supplier<? extends T> other)

功能類似orElse都是返回值,不同在于它能使用lambda表達式更靈活的處理返回默認值

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.ofNullable(null);
        System.out.println(op.orElseGet(() -> String.valueOf(true)));
    }

}

輸出 true

8. ifPresent(Consumer<? super T> consumer)

如果值存在,則執(zhí)行l(wèi)ambda表達式,否則不做任何處理。注意它沒有返回值。

public class OptionalStudy {
    
    public static void main(String[] args) throws Exception {
        Optional<String> op = Optional.ofNullable(null);
        op.ifPresent((v)->{System.out.println(v);});
    }

}

沒有任何輸出,因為值不存在。

總結

以上就是所有能夠用到的方法,可以在你的項目中去使用。對所有方法的參數使用optional進行包裹,避免空指針。更多學習總結,請關注我的公眾號mike啥都想搞,更有精品學習資料相送。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容