Optional源碼解析與實踐( 四 )

  • System.out.println("optional2的map前的值:"+optional2);
  • result =optional2.map(t->t.getName());
  • System.out.println("optional2的map后的值:"+result);
  • System.out.println("===========flatMap========");
  • System.out.println("optional1的flatMap前的值:"+optional1);
  • Optional<Integer> result2 =optional1.flatMap(t->Optional.ofNullable(t.getAge()));
  • System.out.println("optional1的flatMap后的值:"+result2);
  • System.out.println("optional2的flatMap前的值:"+optional2);
  • result2 =optional2.flatMap(t->Optional.ofNullable(t.getAge()));
  • System.out.println("optional2的flatMap后的值:"+result2);
  • }
  • public class User {
  • String name;
  • Integer age;
  • public User(String name,Integer age){
  • this.name = name;
  • this.age=age;
  • }
  • public String getName() {
  • return name;
  • }
  • public Integer getAge() {
  • return age;
  • 4)運行結果
    Optional源碼解析與實踐

    文章插圖
    3 應用實例3.1 錯誤用法
    • 由于Optional并沒有實現Serializable接口,所以不能作為類的屬性 。
    • 不要把Optional作為方法的參數 。
    • 把if(x!=null)直接換成Optional.ofNullable(x).isPresent(),這樣有過度編碼的嫌疑 。
    • 直接使用Optional.get()的返回值進行操作,String result =Optional.ofNullable(null).get().toString();這樣還是會拋出異常的 。
    3.2 建議用法A類有屬性B類,B類有屬性C類,C類有name這個字段 。使用Optional之前:
    1. if(atest!=null){
    2. Btest btest =atest.getBtest();
    3. if(btest!=null){
    4. Ctest ctest = btest.getCtest();
    5. if (ctest != null) {
    6. name =ctest.getName();
    7. }
    8. }
    9. }
    使用Optional之后:
    1. name = Optional.ofNullable(atest).map(t->t.getBtest()).map(t->t.getCtest()).map(t->t.getName()).orElse("默認值");
    代碼是不是看上去更整潔了呢?
    4 總結通過對Optional源碼解析和用例測試代碼的運行結果 , 可以看出使用Optional可以優化null值判斷代碼,讓代碼變得更加優雅和整潔 。
    自猿其說Tech-JDL京東物流技術與數據智能部作者:陳昌浩

    推薦閱讀