JDK1.8新特性 optional類的使用(五)

空指針異常是導致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

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