空指針異常是導致Java應用程序失敗的最常見原因。以前,爲了解決空指針異常,Google公司著名的Guava項目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵程序員寫更乾淨的代碼。受到Google Guava的啓發,Optional類已經成爲Java 8類庫的一部分。Optional實際上是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測
1、ofNullable()和of()方法
Optional.of()或者Optional.ofNullable():創建Optional對象,差別在於of不允許參數是null,而ofNullable則無限制,因此我們通常情況下使用ofNullable()方法。
// 參數不能是null
Optional<Integer> optional1 = Optional.of(1);
// 參數可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);
// 參數可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);
2、isPresent():判斷值是否存在
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// isPresent判斷值是否存在
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);
3、ifPresent()方法的使用
ifPresent(Consumer consumer):如果option對象保存的值不是null,則調用consumer對象,否則不調用
Person person=new Person("zhang","zhaolaing");
Optional<Person> optionalPerson=Optional.ofNullable(null);
optionalPerson.ifPresent(p->{
System.out.println(p.firstName);
System.out.println(p.lastName);
});
4、orElse的使用
如果optional對象保存的值不是null,則返回原來的值,否則返回value
Person person=new Person();
Optional<Person> optionalPerson=Optional.ofNullable(null);
System.out.println(optionalPerson.orElse(new Person()));
System.out.println(optionalPerson.orElse(null));
5、orElseGet的使用
功能與orElse一樣,只不過orElseGet參數是一個對象
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> {
return 1000;
}) == 1);//true
System.out.println(optional2.orElseGet(() -> {
return 1000;
}) == 1000);//true
6、filter(Predicate)的使用
如果ofNullable(null)爲空,則不會執行filter裏面的predicate,如果有值,才執行裏面內容。
Optional<Integer> optional1 = Optional.ofNullable(null);
Optional<Integer> filter1 = optional1.filter((a) -> {
System.out.println("aaaaaa");
return false;
});
System.out.println(filter1.isPresent());// false
7、map的使用
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
Optional<String> str1Optional = optional1.map((a) -> "key" + a);
Optional<String> str2Optional = optional2.map((a) -> "key" + a);
System.out.println(str1Optional.get());// key1
System.out.println(str2Optional.isPresent());// false
System.out.println(str2Optional.orElse(null));
8、flatMap()方法
功能與map()相似,差別請看如下代碼。flatMap方法與map方法類似,區別在於mapping函數的返回值不同。map方法的mapping函數返回值可以是任何類型T,而flatMap方法的mapping函數必須是Optional
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Optional<String>> str1Optional = optional1.map((a) -> {
return Optional.<String>of("key" + a);
});
Optional<String> str2Optional = optional1.flatMap((a) -> {
return Optional.<String>of("key" + a);
});
System.out.println(str1Optional.get().get());// key1
System.out.println(str2Optional.get());// key1
參考來自:https://blog.csdn.net/aitangyong/article/details/54564100