JDK8 Optional操作學習

  • 2019 年 10 月 20 日
  • 筆記

介紹

Optional是JDK8中提供用於包含未知對象的工具類,即可以利用Optional包裝對象來避免繁瑣的空指針檢查,以及NullPointException的處理,在Optional中,用value代表所包裹的對象。

API

方法名稱 返回類型 參數 功能
static empty Optional 生成一個空的Optional對象
static of Optional T value 返回一個包裹給定對象的Optional對象
static ofNullable Optional T value 若參數對象不為null,這返回包裹該參數對象的Optional對象,否則返回一個空的Optional對象
equals boolean Object 僅當參數類型為Optional 且 參數中的Optional包裹的值與參數中的值相等時返回為true其餘都返回false
filtrer Optional Predicate<? super T > predicate 過濾器,過濾出滿足predicate函數中定義的判斷條件的value,並將此value用Optional包裹起來,若value都不滿足,這返回一個空的Optional對象
flatMap Optional Function<? super T,Optional> mapper 根據提供的映射函數,將Optional中的value值應用與mapper方法,並將返回結果包裝為一個Optional對象,若mapper返回結果為null,這返回一個空的Optional對象
get T 返回Optional中的value,若Optional為空,則拋出NoSuchElementException
hsahCode int 返回value的hashCode值,若value為null,則返回0
ifPresent void Consumer<? super T> consumer 若Optional中value不為空,則讓value執行參數提供的consumer函數,否則不採取任何行動
ifPresentOrElse void Consumer<? super T> consumer, Runnable emptyAcrion 若Optional中value不為空,則讓value執行參數提供的consumer函數,否則執行參數提供的emptyAction中的run方法
isPresent boolean 判斷Optional中value是否為空,為空則返回false
map Optional Function<? super T, extends U> mapper 若Optional中value不為空,則將value應用與提供的mapper方法,並且若返回結果不為空,則返回包裹該結果的Optional對象
orElse T T other 若Optional中的value不為空,則返回該value,否則返回參數提供的other
orElseGet T Supplier<? extend T > other 若Optional中的value不為空,則返回value,否則返回函數other的執行結果
orElseThrow T Supplier<? extends X> exceptionSupplier 若Optional中的value為空,則執行參數提供的函數,並拋出參數函數中指定的異常資訊

Optiona使用

  • 1 Optiona對象的獲取一共有三種方式,都是靜態方法,同時Optional源碼中將構造函數設置為私有,以及提供了一個靜態常量 EMPTY來表示值為空的Optional對象。of 與 ofNullable的區別在於當給定的參數為null時,of會拋出NullPointException,而ofNullable則會返回一個空的Optional對象,對於希望避免處理NullPointException的建議還是使用ofNullable。
  • 2 get是返回當前Optional對象中的value對象,一般需要配合isPresent() 或 isEmpty()先進行判斷在做處理,否則還需要專門處理NoSuchElementException異常。
  • 3 ifPresent值僅提供了當Optional中value不為null時的處理方法,而ifPresentOrElse則提供了兩種處理方法,value不為空則執行comsumer方法,否則執行Runnable的emptyAction方法.
Person p1 = null;          Optional<Person> pop2 = Optional.ofNullable(p1);          pop2.ifPresent(person -> {System.out.println(person);});            pop2.ifPresentOrElse(person -> {System.out.println(person);},() ->{System.out.println("the value is empty!");});
  • 4 filter用於判斷,若Optional中的value滿足參數提供的predicate函數,這返回該Optional對象,否則返回value為空的Optional對象
Person person1 = new Person("kaithy",23);          Person person2 = new Person("lucy",24);          Person person3 = new Person("lili",25);            List<Person> persons = new ArrayList<>();          persons.add(person1);          persons.add(person2);          persons.add(person3);            Optional<List<Person>> optional = Optional.ofNullable(persons);            Optional<List<Person>> fop = optional.filter(people -> {return people.contains(person1);});          //判斷是否為同一個對象,結果顯示為true          System.out.println(fop == optional);          System.out.println(fop.equals(optional));
  • 5 map 與 flatMap 功能都是將Optional中的value執行參數提供的mapper函數,將value映射為一個新的值,並將新值用Optional包裹,若value為null,則會返回EMPTY。區別在於,若mapper函數返回的結果為null,map會返回一個EMPTY,但是flatMap則會拋出NullPointException。
    (PS:(1).映射的後的值會用一個新的Optional對象包裹,而非更新原有的value值;
    (2).所有value為null的Optional對象都是相同的,即Optional中提供的EMPTY這一靜態常量);
Person person1 = new Person("kaithy",23);          Person person2 = new Person("lucy",24);            Optional<Person> optional = Optional.ofNullable(person1);            Optional<Person> mapOp = optional.map(person -> {              return null;          });            System.out.println(mapOp.isPresent());            Optional<Person> mapOp2 = optional.map(person -> {return null;});            System.out.println(mapOp == mapOp2);            Optional<Person> mapOp3 = optional.map(person -> {return person;});          //mapper返回值相同,判斷是否是同一個Optional對象          System.out.println(optional == mapOp3);            //會拋出NullPointException          Optional<Person> flatMapOp = optional.flatMap(person -> {              return null;          });
  • 6 or 中提供的參數用於當Optional中的value為null時,生成一個特定的Optional對象的方法,當value不為空,這直接返回當前的Optional對象,否則就用supplier函數生成一個Optional對象,若supplier為null或返回結果為null,會拋出NullPointException。
Person person1 = new Person("kaithy",23);          Person person2 = new Person("lucy",24);            Optional<Person> optional = Optional.ofNullable(person1);            Optional<Person> mapOp = optional.map(person -> {              return null;          });            mapOp = mapOp.or(()->{              return Optional.ofNullable(person2);          });            System.out.println(mapOp.isPresent());  
  • 7 orElse、orElseGet、orElseThrow分別代表了一種獲取當前Optional中value值的方式,若value為null,orElse返回參數中的值,orElseGet返回參數提供的函數的執行結果,orElseThrow這拋出異常,默認NullPointException,也可以在參數中指定要拋出的異常類型
Person person1 = new Person("kaithy",23);          Person person2 = new Person("lucy",24);            Optional<Person> optional = Optional.ofNullable(person1);            Optional<Person> mapOp = optional.map(person -> {              return null;          });            Person p1 = mapOp.orElse(person2);            System.out.println(p1);            Person p2 = mapOp.orElseGet(() ->{              return new Person("laila",25);          });            System.out.println(p2);            try {              Person p3 = mapOp.orElseThrow(() ->{                  return new RuntimeException("empty value");              });              System.out.println(p3);          }catch (RuntimeException e) {              System.out.println(e.getMessage());          }  

上文轉載自自己的個人部落格,主要記錄自己的成長經歷,用輸出倒逼自己努力學習。鏈接地址:https://kaithyrookie.github.io/2018/10/20/Java-Optional%E4%BD%BF%E7%94%A8/