1. 程式人生 > >java8,你應該瞭解的新特性(空指標終結者:Optional 類)

java8,你應該瞭解的新特性(空指標終結者:Optional 類)

1、java.lang.NullPointerException是最常見也是最令人討厭的一種異常,如果一個物件可能為null,在呼叫其方法之前必須進行非空檢查,否則就會引發java.lang.NullPointerException。但是,很多物件永遠都不會為null,如果能把那些可能為null的物件明確的標識出來,只對null嫌疑者進行判斷,豈不是既可避免java.lang.NullPointerException有可避免不必要的非空判斷?

Optional 類(java.util.Optional) 是一個容器類,它明確指示開發者哪些物件需要非空檢查的。代表一個值存在或不存在,原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。並且可以避免空指標異常。

2、常用方法:

Optional.of(T t) : 建立一個 Optional 例項
Optional.empty() : 建立一個空的 Optional 例項
Optional.ofNullable(T t):若 t 不為 null,建立 Optional 例項,否則建立空例項
isPresent() : 判斷是否包含值
orElse(T t) : 如果呼叫物件包含值,返回該值,否則返回t
orElseGet(Supplier s) :如果呼叫物件包含值,返回該值,否則返回 s 獲取的值
map(Function f): 如果有值對其處理,並返回處理後的Optional,否則返回 Optional.empty()
flatMap(Function mapper):與 map 類似,要求返回值必須是Optional

3、演示

測試實體類

這裡寫圖片描述

(1)Optional.of(T t) 演示

這裡寫圖片描述

注意:在測試時,我們會直接new一個物件,但是在實際開發中,可能會傳入某個物件,當這個物件為空時依然會報空指標異常。如下圖。

這裡寫圖片描述

(2)Optional.empty()會給我們建立一個本身就是空的Optional 例項。Optional.ofNullable(T t)會先進行判斷,當傳入的物件不為空時,呼叫of()方法,當物件為空時,呼叫.empty()方法。

這裡寫圖片描述

(3)isPresent() : 判斷是否包含值

這裡寫圖片描述

注意:如果我們直接使用of()方法建立的Optional例項,如果傳入的是null,則該判斷依然會報NullPointerException

這裡寫圖片描述

分析

當傳入null時,ofNullable會進行null判斷,當時of不會進行判斷。而是直接呼叫new Optional<>(value)方法建立例項,而Optional在建立例項時會呼叫Objects的requireNonNull(value)方法進行非空校驗,當時null值時,會丟擲NullPointerException錯誤。

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

(4)orElse(T t)與orElseGet(Supplier s)

當傳入的物件不為空時:

這裡寫圖片描述

當傳入的物件為空時:

這裡寫圖片描述

orElseGet(Supplier s)區別在於,傳入的為Supplier(供給型介面),可以對物件進行相對於的操作。

(5)map(Function f)與flatMap(Function mapper)

這裡寫圖片描述

區別:兩個方法的返回值型別不同,以示例為例,map要求返回值型別是Emp及其子類,而flatmap則要求返回值型別必須為Optional 。

4、應用

(1)假設UserDao不一定會被注入進UserService,原來必須使用@Autowired(required = false),但是現在直接使用Optional即可。

這裡寫圖片描述

(2)在Spring MVC中,下面的程式碼表示userName引數是可選的,即請求引數可不包含userName。

這裡寫圖片描述