Jdk1.8新特性學習(Optional)

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

介紹

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

實例化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)

如果值存在,則執行lambda表達式,否則不做任何處理。注意它沒有返回值。

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啥都想搞,更有精品學習資料相送。

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