Java 8——Optional泛型類
整理自http://www.importnew.com/6675.html
http://www.cnblogs.com/WJ5888/p/4618465.html
一、Optional泛型包裝類
Optional類的目的是表示被Optional泛型包裝的型別有可能為空(null),並讓對這種情況作出處理。
新版本的Java 8引入了一個新的Optional類。Optional類的Javadoc描述如下:
這是一個可以為null的容器物件。如果值存在則isPresent()方法會返回true,呼叫get()方法會返回該物件。
本文會逐個探討Optional類包含的方法,並通過一兩個示例展示如何使用。
of
為非null的值建立一個Optional。
of方法通過工廠方法建立Optional類。需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲NullPointerException 。
1 2 3 4 |
//呼叫工廠方法建立Optional例項
Optional<String>
name = Optional.of( "Sanaulla" );
//傳入引數為null,丟擲NullPointerException.
Optional<String>
someNull = Optional.of( null );
|
ofNullable
為指定的值建立一個Optional,如果指定的值為null,則返回一個空的Optional。
ofNullable與of方法相似,唯一的區別是可以接受引數為null的情況。示例如下:
1 2 3 |
//下面建立了一個不包含任何值的Optional例項
//例如,值為'null'
Optional
empty = Optional.ofNullable( null );
|
isPresent
非常容易理解
如果值存在返回true,否則返回false。
類似下面的程式碼:
1 2 3 4 5 |
//isPresent方法用來檢查Optional例項中是否包含值
if
(name.isPresent()) {
//在Optional例項內呼叫get()返回已存在的值
System.out.println(name.get()); //輸出Sanaulla
}
|
get
如果Optional有值則將其返回,否則丟擲NoSuchElementException。
上面的示例中,get方法用來得到Optional例項中的值。下面我們看一個丟擲NoSuchElementException的例子:
1 2 3 4 5 6 7 |
//執行下面的程式碼會輸出:No
value present
try
{
//在空的Optional例項上呼叫get(),丟擲NoSuchElementException
System.out.println(empty.get());
}
catch
(NoSuchElementException ex) {
System.out.println(ex.getMessage());
}
|
ifPresent
如果Optional例項有值則為其呼叫consumer,否則不做處理
要理解ifPresent方法,首先需要了解Consumer類。簡答地說,Consumer類包含一個抽象方法。該抽象方法對傳入的值進行處理,但沒有返回值。Java8支援不用介面直接通過lambda表示式傳入引數。
如果Optional例項有值,呼叫ifPresent()可以接受介面段或lambda表示式。類似下面的程式碼: