1.背景
調(diào)用一個(gè)方法得到了返回值卻不能直接將返回值作為參數(shù)去調(diào)用別的方法。我們首先要判斷這個(gè)返回值是否為null函卒,只有在非空的前提下才能將其作為其他方法的參數(shù);否則的會(huì)出現(xiàn)空值異常屋摔。
據(jù)說(shuō)在酷含,Java8以前,Google Guava引入了Optionals類來(lái)解決NullPointerException哨毁,從而避免源碼被各種null檢查污染枫甲,以便開(kāi)發(fā)者寫(xiě)出更加整潔的代碼。Java 8也將Optional加入了官方庫(kù)扼褪。
2.Optional的基本使用
- of() 為非null的值創(chuàng)建一個(gè)Optional
注意:如果傳入?yún)?shù)為null想幻,則拋出NullPointerException 。 - ofNullable() 為指定的值創(chuàng)建一個(gè)Optional话浇,如果指定的值為null脏毯,則返回一個(gè)空的Optional。
注意: 可以接受參數(shù)為null幔崖,區(qū)別于 of() 食店。
//of 為非null的值創(chuàng)建一個(gè)Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null赏寇,則返回一個(gè)空的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 如果有值自娩,則對(duì)其執(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é)束時(shí)旱眯,flatMap不會(huì)對(duì)結(jié)果用Optional封裝
Optional<String> filter = cap.filter(s->s.length()<6);
System.out.println(filter);
3.總結(jié)
Optional類的提供一些便利的方法和lambda表達(dá)式使得晨川,在做程序判空時(shí),十分便利删豺,本文只是對(duì)optional的方法簡(jiǎn)要使用Demo共虑。最后匯總待碼如下,實(shí)在時(shí)太簡(jiǎn)單了呀页,就不放在github了妈拌。
補(bǔ)充知識(shí)連接:
import java.util.Optional;
public class Optional_Demo {
public static void main(String[] args) {
//of 為非null的值創(chuàng)建一個(gè)Optional
Optional<String> opt_full = Optional.of("helloworld");
//ofNullable() 為指定的值創(chuàng)建一個(gè)Optional,如果指定的值為null蓬蝶,則返回一個(gè)空的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 如果有值缓窜,則對(duì)其執(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é)束時(shí)黄娘,flatMap不會(huì)對(duì)結(jié)果用Optional封裝
Optional<String> filter = cap.filter(s->s.length()<6);
System.out.println(filter);
}
}
運(yùn)行結(jié)果