摘要:本文主要學習了Java1.8新增長的Optional類。html
部份內容來自如下博客:java
https://www.cnblogs.com/1ning/p/9140800.html函數
對於Java開發人員來講,NullPointException是很常見的一個異常,爲了不這個異常,一般的作法是進行if條件判斷,但若是代碼裏面充滿了大量的null判斷會讓程序變的再也不優雅。學習
因此而Java1.8中引入了一個新的Optional類,用來處理可能爲null的變量,在減小NullPointException的同時,也提高了代碼的美觀度。但首先咱們須要明確的是,它並非對null關鍵字的一種替代,而是對於null斷定提供了一種更加優雅的實現,從而避免NullPointException。spa
含義:用來建立一個空的Optional對象。code
代碼以下:htm
1 Optional<String> name = Optional.empty();
含義:用來包裝一個不爲null的對象,若是對象爲null,則拋出NullPointException。對象
代碼以下:blog
1 Optional<String> name = Optional.of(str);
含義:用來包裝一個能夠爲null的對象,若是對象爲null,則建立一個空的Optional對象。接口
代碼以下:
1 Optional<String> name = Optional.ofNullable(str);
含義:用來判斷Optional對象是否爲空,若是爲空則返回true,若是不爲空則返回false。
代碼以下:
1 Optional<String> name = Optional.ofNullable(null); 2 System.out.println(name.isPresent());// true
含義:若是Optional對象不爲空則執行方法調用,若是爲空則什麼也不作。
代碼以下:
1 Optional<String> name = Optional.ofNullable("name"); 2 name.ifPresent(System.out::println);// name
含義:若是Optional對象不爲空,則返回值,若是爲空,則拋出NoSuchElementException。
代碼以下:
1 Optional<String> name = Optional.ofNullable("name"); 2 System.out.println(name.get());// name
含義:若是Optional對象不爲空,則返回值,若是爲空,則返回指定的值。
代碼以下:
1 Optional<String> name = Optional.ofNullable(null); 2 System.out.println(name.orElse("no name"));// no name
含義:若是Optional對象不爲空,則返回值,若是爲空,則返回由傳入的Supplier函數式接口生成的值。
代碼以下:
1 Optional<String> name = Optional.ofNullable(null); 2 System.out.println(name.orElseGet(() -> "no name"));// no name
含義:若是Optional對象不爲空,則返回值,若是爲空,則返回由傳入的Supplier函數式接口生成的異常。
代碼以下:
1 Optional<String> name = Optional.ofNullable(null); 2 System.out.println(name.orElseThrow(() -> new NullPointerException()));// java.lang.NullPointerException
含義:判斷Optional的值是否知足filter指定的條件,若是知足則返回原來的Optional對象,若是不知足則建立一個空的Optional對象並返回。
代碼以下:
1 Optional<String> name = Optional.ofNullable("name").filter(e -> e != null); 2 System.out.println(name);// Optional[name]
含義:若是Optional不爲空,則執行傳入的返回值爲任意類型的Function函數式接口並將返回值包裝爲Optional對象,若是Optional爲空,則建立一個空的Optional對象並返回。
代碼以下:
1 Optional<Integer> length = Optional.ofNullable("name").map(String::length); 2 System.out.println(length);// Optional[4]
含義:若是Optional不爲空,則執行傳入的返回值爲Optional類型的Function函數式接口並獲得返回的Optional對象,若是Optional爲空,則建立一個空的Optional對象並返回。
代碼以下:
1 User user = null; 2 user = Optional.ofNullable(user).flatMap(Optional::ofNullable).orElse(new User()); 3 System.out.println(user);// test.User@768debd
這兩個方法在調用的Optional對象不爲空時,返回的都是原對象。當Optional對象爲空時,orElse()方法返回指定的值,orElseGet()方法返回的是接口調用的返回值。
此外,若是Optional對象若是不爲空,orElse()方法也會執行,orElseGet()方法不會執行。
好比,orElse()方法返回一個新的對象,orElseGet()方法調用接口返回的也是一個新的對象,若是Optional對象不爲空,orElse()方法會執行初始化,orElseGet()方法不會執行初始化。
這兩個方法在調用的Optional對象爲空時,都會建立一個空對象返回。若是Optional對象不爲空,map()方法會將執行接口獲得的返回值包裝爲Optional對象,flatMap()方法會直接返回執行接口獲得的Optional類型的返回值。