1.背景
調(diào)用一個方法得到了返回值卻不能直接將返回值作為參數(shù)去調(diào)用別的方法。我們首先要判斷這個返回值是否為null,只有在非空的前提下才能將其作為其他方法的參數(shù);否則的會出現(xiàn)空值異常。
據(jù)說在,Java8以前,Google Guava引入了Optionals類來解決NullPointerException,從而避免源碼被各種null檢查污染,以便開發(fā)者寫出更加整潔的代碼。Java 8也將Optional加入了官方庫。
2.Optional的基本使用
- of() 為非null的值創(chuàng)建一個Optional
注意:如果傳入?yún)?shù)為null,則拋出NullPointerException 。 - ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
注意: 可以接受參數(shù)為null,區(qū)別于 of() 。
//of 為非null的值創(chuàng)建一個Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
Optional<String> opt_empty = Optional.ofNullable(null);
- isPresent() 如果值存在返回true,否則返回false
System.out.println("opt_full:"+opt_full.isPresent());
System.out.println("opt_empty:"+opt_empty.isPresent()); - full.get() 如果Optional有值則將其返回,否則拋出NoSuchElementException *
if(opt_full.isPresent()){
System.out.println("opt_full的內(nèi)容:"+opt_full.get());
}
- map 如果有值,則對其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional
Optional<String> cap = opt_full.map(s->s.toUpperCase());
System.out.println(cap.get()); - filter(),為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回值必須是Optional。調(diào)用結(jié)束時,flatMap不會對結(jié)果用Optional封裝
Optional<String> filter = cap.filter(s->s.length()<6);
System.out.println(filter);
3.總結(jié)
Optional類的提供一些便利的方法和lambda表達(dá)式使得,在做程序判空時,十分便利,本文只是對optional的方法簡要使用Demo。最后匯總待碼如下,實(shí)在時太簡單了,就不放在github了。
補(bǔ)充知識連接:
import java.util.Optional;
public class Optional_Demo {
public static void main(String[] args) {
//of 為非null的值創(chuàng)建一個Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。
Optional<String> opt_empty = Optional.ofNullable(null);
//isPresent() 如果值存在返回true,否則返回false
System.out.println("opt_full:"+opt_full.isPresent());
System.out.println("opt_empty:"+opt_empty.isPresent());
//full.get() 如果Optional有值則將其返回,否則拋出NoSuchElementException
if(opt_full.isPresent()){
System.out.println("opt_full的內(nèi)容:"+opt_full.get());
}
//orElse() 如果有值則將其返回,否則返回指定的其它值。
System.out.println(opt_full.orElse("試圖修改內(nèi)容"));
System.out.println(opt_empty.orElse("試圖修改內(nèi)容"));
//map 如果有值,則對其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional
Optional<String> cap = opt_full.map(s->s.toUpperCase());
System.out.println(cap.get());
//如果有值,為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回值必須是Optional。調(diào)用結(jié)束時,flatMap不會對結(jié)果用Optional封裝
Optional<String> filter = cap.filter(s->s.length()<6);
System.out.println(filter);
}
}
運(yùn)行結(jié)果