Like Share Discussion Bookmark Smile

J.J. Huang   2020-04-07   Java   瀏覽次數:

Java 8 | Optional

Java應用中最常見的bug就是空值異常。在Java 8之前,Google Guava引入了Optionals類來解決NullPointerException,從而避免源碼被各種null檢查污染,以便開發者寫出更加整潔的程式碼。

Java 8也將Optional加入了官方庫。

Optional僅僅是一個容易:存放T類型的值或者null。它提供了一些有用的接口來避免顯式的null檢查,可以參考Java 8官方文件了解更多細節。

使用Optional的例子:可能為空的值或者某個類型的值:

1
2
3
4
Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );

輸出的結果為:

1
2
3
Full Name is set? false
Full Name: [none]
Hey Stranger!

如果Optional實例持有一個非空值,則isPresent()方法返回true,否則返回falseorElseGet()方法,Optional實例持有null,則可以接受一個lambda表達式生成的默認值;map()方法可以將現有的Optional實例的值轉換成新的值;orElse()方法與orElseGet()方法類似,但是在持有null的時候返回傳入的默認值。

另一個例子:

1
2
3
4
5
Optional< String > firstName = Optional.of( "Morose" );
System.out.println( "First Name is set? " + firstName.isPresent() );
System.out.println( "First Name: " + firstName.orElseGet( () -> "[none]" ) );
System.out.println( firstName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
System.out.println();

輸出的結果為:

1
2
3
First Name is set? true
First Name: Morose
Hey Morose!

註:更詳細的內容,可以參考官方文件


註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南