java8新特性五:Optinal

空指針異常可能佔據了一半的異常發生率。因而oracle想用optional這類‘優雅的’解決null。想象挺美好,現實很殘酷。顯然optional並無使代碼變得那麼優雅。看了七八篇大神的博客,無論從代碼量或者代碼思想上都沒有什麼質的改變,你仍然要時刻擔憂null的出現及給它相應的處理。若是你想統一處理還不如直接代碼try catch  空指針異常。在我發現它真正對代碼的改善前,暫且不推薦(不過阿里推薦,仍是人家牛,聽阿里的吧)oracle

更新------------------------------------------------------函數

本着求真務實的精神,今天更加詳細分析一下optional的使用方法。(根據實際開發,理論玩家無視)。指針

1,首先是構造方法 Optional.of(), Optional.ofNullable() ,Optional.empty()。對象

Optional.of():of方法在傳入的參數爲null時,拋出空指針異常。許多博客都說要在肯定參數不爲null時使用。可要是肯定參數不爲null,爲何要用Optional。我的觀點,Optional,的全部方法中,可能會拋出空指針異常的,都違背了使用Optional的初衷。如get()方法。開發

Optional.empty():構造一個空值值 optional,非特殊狀況無使用價值。默認就使用ofNullable()方法構造。get

2,各方法的使用 博客

   ①isPresent() 根據是否爲空返回boolean。一個挖坑又填坑的方法。直接判斷參數==null?很差嗎。it

   ②ifPresent(Consumer)  在對象不爲空時,執行Consumer(函數表達式),空時不執行。至關於if(obj==null){.....},的簡便寫法。你可能會說這也沒什麼大用啊,個人硬盤又不在意多一行代碼,再想寫個else都不行。這個。。。。你說的對。 但這已是Optional中比較有用的方法了。io

   ③get() 獲取optional中的值,空則拋出異常。前面說了,這個方法看不出來使用價值map

   ④orElse(T other) 若是爲空,用other替代。一樣可用一行if替代。但你可用來裝一下

   ⑤orElseThrow  若是爲空拋出異常。不想評價它

   ⑥map   若是你從一個對象中想獲得第若干層的子對象,每一層都要都要空值校驗如,Obj=obj1.get("obj2").get("obj3").get("obj4");上一個get方法返回的值爲null時,下一個get方法執行時都會拋異常。因而就要寫若干層if。map則容許進行鏈式操做,在最後才處理null值。這是optional最值得使用的方法。

Optional.ofNullable(userEntity1).map(u -> u.getUsername())
           .map(name -> name.toUpperCase()).orElse(null);
相關文章
相關標籤/搜索