用optional取代null
Java8引入了java.util.Optional<T>,它是一個封裝的Optional值的類。變量存在時,Optional類只是對類簡單封裝。變量不存在時,缺失的值會被建模成一個空的Optional對象,由方法Optional.empty()返回。Optional.empty()是一個靜態工廠方法,返回Optional類的特定單一實例。
在代碼中應始終如一的使用Optional,能非常清晰地界定出變量值的缺失時結構上的問題還是算法上的缺陷,抑或是數據中的問題。引入Optional並非要消除每個null引用,它的目標是幫助你更好的設計出適合的API。
創建Optional對象
聲明一個空的Optional
Optional<Car> optCar = Optional.empty();
創建一個非空的Optional,若car為null,則拋出NullPointerException
Optional<Car>optCar = Optional.of(car);
可接受null的Optional
Optional<Car> optCar = Optional.ofNullable(car);
Optional提供了一個map方法。map操作會將提供的函數應用於流的每個元素,可以把Optional對象看成一種特殊的集合數據,它至少包含一個元素。若Optional包含一個值,那map就講該值作為參數傳遞給map,對該值進行轉換。若Optional為空,則什麽都不做。
Optional<Instance> optInstance = Optional.ofNullable(instance);
Optional<String> name = optInstance.map(Instance::getName);
Optional提供了flatMap方法。flatMap方法接受一個函數作為參數,這個函數的返回值是另一個流。flatMap會應用到流中的每個元素並形成一個新的流,但flatMap會用流的內容替換每個新生成的流。即由方法生成的各個流會被合並或扁平化為一個單一的流。該調用邏輯上可劃分為兩步:第一。某個Function作為參數,被傳遞給由Optional封裝的對象,對其進行轉換。Function的具體表現是一個方法引用,返回一個Optional對象,最終兩個Optional對象會被flatMap合並。可以將這種合並操作簡單的看成把兩個Optional對象結合在一起,若其中有一個對象為空,就構成一個空的Optional對象,若對一個空的Optional對象調用flatMap,則返回一個空的Optional。Optional類沒有實現Serializable接口。
Optional提供了isPresent()方法,若Optional對象包含值,則返回true。
Optional提供了以下方法讀取Optional實例中的值:
get():若變量存在,則直接返回封裝的變量值,否則拋出一個NoSuchElementException。
orElse(T):允許在Optional對象不包含值時提供一個默認值
orElseGet(Supplier<? extends T>):某個方法在Optional對象不含值時被調用
orElseThrow(Supplier<? extends T>):當Optional不存在時拋出指定異常
ifPresent(Consumer<? super T>):變量值存在時執行一個作為參數存在的方法
Optional的filter方法接受一個謂詞作為參數,若Optional對象存在並且它符合謂詞的條件,filter方法就返回其值,否則它就返回一個空的Optional對象。
Optional提供了基礎類型的Optional,如OptionalInt,OptionalLong以及OptionalDouble。但是基礎類型不支持map,flatMap及filter方法。Optional對象無法由基礎類型的Optional組合構成。
用optional取代null