Java8學習筆記系列:
一、Optional類的作用
Optional類的作用主要是爲了解決空指針問題,通過對結果的包裝,並使用方法來代替if判斷,爲流式編程打下了良好的基礎。
二、Optional類的初始化
/**
* Optional的初始化
* Optional的構造方法是私有的,所有隻能通過靜態方法去初始化
*/
@Test
public void example1(){
//of 爲指定的類型值創建一個Optional,如果給定的值爲null則會報空指針異常
Optional<String> optional = Optional.of("Hello Optional");
System.out.println(optional.get()); //打印:Hello Optional
//ofNullable 爲指定的類型值創建一個Optional,它與of的區別在於可以傳null,當值爲null時則創建一個空的Optional
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o instanceof Optional); //打印:true
//empty 獲取Optional的靜態初始化空對象,單例實現,全局唯一
Optional<Object> empty = Optional.empty();
System.out.println(o == empty); //打印:true
}
三、Optional類的API使用示例
/**
* Optional的isPresent方法:如果值存在返回true,否則返回false
*/
@Test
public void example2(){
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o.isPresent()); //打印:false
Optional<String> optional = Optional.ofNullable("Hello Optional");
System.out.println(optional.isPresent()); //打印:true
}
/**
* Optional的get方法:如果值存在則返回,否則拋出NoSuchElementException異常
*/
@Test
public void example3(){
Optional<String> optional = Optional.ofNullable("Hello Optional");
System.out.println(optional.get()); //打印:Hello Optional
Optional<Object> o = Optional.ofNullable(null);
System.out.println(o.get()); //拋出:NoSuchElementException異常
}
/**
* Optional的ifPresent方法:如果有值則調用Consumer,否則不做處理
*/
@Test
public void example4(){
Optional<String> optional = Optional.ofNullable("Hello Optional");
optional.ifPresent(x -> System.out.println(x)); //簡化前
optional.ifPresent(System.out::println); //簡化後
optional.ifPresent(this::doSomething); //自定義
//打印結果均爲:Hello Optional
}
private void doSomething(String s){
System.out.println(s);
}
/**
* Optional的orElse方法:如果有值則返回,否則返回其他指定的值
*/
@Test
public void example5(){
System.out.println(Optional.empty().orElse("備胎")); //打印:備胎
System.out.println(Optional.of("張三").orElse("備胎")); //打印:張三
}
/**
* Optional的orElseGet方法:如果有值則返回值,否則返回supplier的接口實現生成默認值
*/
@Test
public void example6(){
System.out.println(Optional.empty().orElseGet(() -> "備胎")); //打印:備胎
System.out.println(Optional.of("張三").orElseGet(() -> "備胎")); //打印:張三
}
/**
* Optional的orElseThrow方法:如果沒有值則拋出一個異常
*/
@Test
public void example7(){
try {
System.out.println(Optional.empty().orElseThrow(() -> new Exception("操作異常")));
}catch (Exception e){
System.out.println(e.getMessage());
}
}
/**
* Optional的map方法:
* 傳入參數mapper如果爲null,則拋出空指針異常。
* mapper不爲空則檢查Optional是否爲空,爲空則返回空Optional
* Optional不爲空時則執行mapper參數的function方法得到mapper返回值
* mapper返回值爲空則返回空Optional,否則創建包含mapper返回值的Optional進行返回
*
* 與之類似的是flatMap方法:它與map的區別是mapper的返回值必須爲Optional,
* 調用結束時不會再對mapper返回值進行Optional封裝
*/
@Test
public void example8(){
//map
Optional<String> optional = Optional.ofNullable(100)
.map(fun1 -> fun1.toString())
.map( x -> x + "100");
System.out.println(optional.orElse("default")); //打印:100100
//flatMap
Optional<String> optional1 = Optional.ofNullable(100)
.flatMap(z -> Optional.ofNullable(z.toString()))
.flatMap(t -> Optional.ofNullable(t + "100"));
System.out.println(optional1.orElse("default")); //打印:100100
}
/**
* Optional的filter方法:
* 如果有值並且滿足斷言條件則返回包含該值的Optional,否則返回空的Optional
*/
@Test
public void example9(){
Optional<String> optional1 = Optional.ofNullable("test")
.filter(s -> s.equals("test"));
System.out.println(optional1.isPresent()); //打印:true
Optional<String> optional2 = Optional.ofNullable("test")
.filter(s -> s.equals("test"))
.filter(t -> t.length() > 5);
System.out.println(optional2.isPresent()); //打印:false
}
參考: