想必大家已經在使用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啥都想搞
,更有精品學習資料相送。