面試為什麼不要用!=null判空了

導語

在沒有用Optional判空之前,你是的話否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統判空的優勢。

面試為什麼不要用!=null判空了

java8之Optional 判空,簡化判空操作

傳統階層判空

為什麼要用Optional,它到底是什麼東西

你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會變得很冗餘,變得難以維護。那麼此時我們就有必要了解Optional了。

Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。Optional 引入可以很好引入可以很好的解決空指針異常。

Optional 的方法,如下圖

面試為什麼不要用!=null判空了

java8之Optional 判空,簡化判空操作

Optional方法-圖1

面試為什麼不要用!=null判空了

java8之Optional 判空,簡化判空操作

Optional方法-圖2

好,方法就是這麼多,其他的也不必多說,相信各位小夥伴一看就懂;如何使用,我還是用代碼演示一步往下一步。

Optional實例

1.of:為非null的值創建一個Optional。of方法通過工廠方法創建Optional類。需要注意的是,創建對象時傳入的參數不能為null。如果傳入參數為null,則拋出NullPointerException 。

<code>Optional optional = Optional.of("xiaoming");//傳入null,拋出NullPointerExceptionOptional o = Optional.of(null);/<code>

2.ofNullable:為指定的值創建一個Optional,如果指定的值為null,則返回一個空的Optional。

<code>Optional o1 = Optional.ofNullable(null);/<code>

3.isPresent:值存在返回true,否則返回false

<code>Optional optiona2 = Optional.of("xiaoming");System.out.println(optiona2.isPresent());/<code>

4.get:Optional有值就返回,沒有拋出NoSuchElementException

<code>Optional o1 = Optional.ofNullable(null);System.out.println(o1.get());/<code>

5.ifPresent:如果Optional有值則調用consumer處理,否則不處理

<code>Optional o1 = Optional.ofNullable(null); o1.ifPresent(s -> System.out.println(s));/<code>

6.orElse:如果有值則將其返回,否則返回指定的其它值

<code>Optional o1 = Optional.ofNullable(null);System.out.println(o1.orElse("輸出orElse")); // 輸出orElse/<code>

7.orElseGet:orElseGet與orElse方法類似,區別在於得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現用來生成默認值

<code>Optional o1 = Optional.ofNullable(null);System.out.println(o1.orElseGet(() -> "default value")); // default value/<code>

*注意:orElse 和 orElseGet 看似差不多,其實有很大不同;看下面例子

<code>Shop shop = null;System.out.println("test orElse");Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");Optional.ofNullable(shop).orElseGet(()->createNew());//createNewprivate static Shop createNew() {  System.out.println("create new");  return new Shop("絲襪", 50);}//輸出:test orElsecreate newtest orElseGetcreate newShop shop = new Shop("長腿絲襪",100);System.out.println("test orElse");Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");Optional.ofNullable(shop).orElseGet(()->createNew());//輸出test orElsecreate newtest orElseGet/<code>

從上面兩個例子可以看到,當Optional 為空時,orElse和orElseGet 區別不大,但當Optional有值時,orElse仍然會去調用方法創建對象,而orElseGet不會再調用方法;在我們處理的業務數據量大的時候,這兩者的性能就有很大的差異。

8.orElseThrow:如果有值則將其返回,否則拋出supplier接口創建的異常。

<code>Optional o1 = Optional.ofNullable(null);try {  o1.orElseThrow(() -> new Exception("異常!"));} catch (Exception e) {  System.out.println("info:" + e.getMessage());}//輸出:info:異常!
/<code>

9.map:如果有值,則對其執行調用mapping函數得到返回值。如果返回值不為null,則創建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。

<code>Optional optional = Optional.of("xiaoming");String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");System.out.println(s); //輸出: XIAOMING/<code>

10.flatMap:如果有值,為其執行mapping函數返回Optional類型返回值,否則返回空Optional。與map不同的是,flatMap 的返回值必須是

<code>Optional,而map的返回值可以是任意的類型TOptional optional = Optional.of("xiaoming");Optional s = optional.flatMap(e -> Optional.of(e.toUpperCase()));System.out.println(s.get()); //輸出:XIAOMING/<code>

11.filter

<code>List strings = Arrays.asList("rmb", "doller", "ou");for (String s : strings) {  Optional o = Optional.of(s).filter(s1 -> !s1.contains("o"));  System.out.println(o.orElse("沒有不包含o的"));}//輸出:rmb沒有不包含o的沒有不包含o的/<code>

小結

Optional 是java非常有用的一個補充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設計的。使用Optional地能更好地幫助我們創建可讀性強,bug更少的應用程序。好了,今天就到這裡了,喜歡的朋友,請關注小編,與小編共同成長!


分享到:


相關文章: