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