真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用Optional擺脫NPE的折磨-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關如何使用Optional擺脫NPE的折磨的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為松江等服務建站,松江等地企業(yè),進行企業(yè)商務咨詢服務。為松江企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

在目前的工作中,我對Java中的Stream和Lambda表達式都使用得很多,之前也寫了兩篇文章來總結對應的知識。

  • 024:Java流實現(xiàn)Shell:cat 1.log | grep a | sort | uniq -c | sort -rn

  • 函數(shù)式編程讓你忘記設計模式

不過對于Optional這個特性,一直沒有很好地使用起來,所以最近又開始閱讀《Java 8實戰(zhàn)》這本書,本文是針對其中第10章的一個學習總結。

背景

在Java中,如果你嘗試對null做函數(shù)調用,就會引發(fā)NullPointerException(NPE),NPE是Java程序開發(fā)中的最典型的異常,對于Java開發(fā)者來說,無論你是初出茅廬的新人和還工作多年的老司機,NPE經(jīng)常讓他們翻車。為了避免NPE,他們會加很多if判斷語句,使得代碼的可讀性變得很差。

從軟件設計的角度來看,null本身是沒有意義的語義,這是一種對缺失變量值的錯誤的建模。

從Java類型系統(tǒng)的角度看,null可以被賦值給任何類型的變量,并且不斷被傳遞,知道最后誰也不知道它是從哪里引入的。

Optional的引入

Java設計者從Haskell和Scala中獲取靈感,在Java 8中引入了一個新的類java.util.Optional<T>。如果一個接口返回Optional,可以表示一個人可能有車也可能沒有車,這個比簡單的返回Car要更明確,閱讀代碼的人不需要提前準備業(yè)務知識。

Optional的目的就在于此:通過類型系統(tǒng)讓你的領域模型中隱藏的知識顯式地體現(xiàn)在你的代碼中。

Optional的使用

方法描述
empty返回一個空的Optional實例
filter如果值存在并且滿足提供的過濾條件,則返回包含該值的Optional對象;否則就返回一個空的Optional對象
map如果值存在,就對該值執(zhí)行提供的mapping函數(shù)調用
flatMap如果值存在,就對該值執(zhí)行提供的mapping函數(shù)調用,返回一個Optional類型的值,否則就返回一個空的Optional對象
ifPresent如果值存在,就執(zhí)行使用該值的方法調用,否則什么也不做
of將指定值用Optional封裝之后返回,如果該值為null,則拋出一個NPE
ofNullable將指定值用Optional封裝之后返回,如果該值為null,則返回一個空的Optional對象
orElse如果有值則返回,否則返回一個默認值
orElseGet如果有值則返回,否則返回一個由指定的Supplier接口生成的值(如果默認值的生成代價比較高的話,則適合使用orElseGet方法)
orElseThrow如果有值則返回,否則返回一個由指定的Supplier接口拋出的異常
get如果值存在,則返回該值,否則拋出一個NoSuchElementException異常
isPresent如果值存在則返回true,否則返回false

上面這張表里列舉了Optional的基礎API,我這里列舉了一些使用的tips:

  • 你可以用ofNullable將一個可能為null的對象封裝為Optional對象,然后獲取值的時候使用orElse方法提供默認值;可以使用empty方法創(chuàng)建一個空的Optional對象;of方法一般不用,不過如果你知道某個值不可能為null,則可以用Optional封裝該值,這樣它一旦為null就會拋出異常。

    //empty方法的使用
    Optional optCar = Optional.empty();

//of方法的使用
Optional optCar = Optional.of(car);

//ofNullable方法的使用
Optional optCar = Optional.ofNullable(car);

 - 你可以使用map方法從Optional對象中它封裝的值中的某個字段的值;
```Java
Optional optInsurance = Optional.ofNullable(insurance);
Optional name = optInsurance.map(Insurance::getName);
  • 如果需要連續(xù)、層層遞進的從某個對象鏈的末端獲取字段的值,則不能全部使用map方法,需要先使用flatMap,最后再使用map方法;

    //轉換之前
    public String getCarInsuranceName(Person person) {
    return person.getCar().getInsurance().getName();
    }

//轉換后
public String getCarInsuranceName(Optional person) {
return person.flatMap(Person::getCar)
.flatMap(Car::Insurance)
.map(Insurance::getName)
.orElse("Unknown");
}

 - Optional中的map、flatMap和filter方法,在概念是與Stream中對應的方法都很類似,區(qū)別就在于Optional中的元素至多有一個,算是Stream的一種特殊情況——一種特殊的集合。
 - 不要使用ifPresent和get方法,它們本質上和不適用Optional對象之前的模式相同,都是臃腫的if-then-else判斷語句;
- 由于Optional無法序列化,所以在領域模型中,無法將某個字段定義為Optional的,原因是:Optional的設計初衷僅僅是要支持能返回Optional對象的語法,如果我們希望在域模型中引入Optional,則可以用下面這種替代的方法:
```Java
public class Person {
  private Car car;
  public Optional getCarAsOptional() {
    return Optional.ofNullable(car);
  }
}
  • 不要使用基礎類型的Optional對象,原因是:基礎類型的Optional對象不支持map、flatMap和filter方法,而這些方法是Optional中非常強大的方法。

實戰(zhàn)案例

案例1:使用工具類方法改良可能拋出異常的API

Java方法處理異常結果的方式有兩種:返回null(或錯誤碼);拋出異常,例如:Integer.parseInt(String)這個方法——如果無法解析到對應的整型,該方法就拋出一個NumberFormationException,這種情況下我們一般會使用try/catch語句處理異常情況。

一般我們建議將try/catch塊單獨提取到一個方法中,在這里使用Optional設計這個方法,代碼如下。在開發(fā)中,可以嘗試構建一個OptionalUtility工具類,將這些復雜的try/catch邏輯封裝起來。

public static Optional stringToInt(String a) {
  try{
    return Optional.of(Integer.parseInt(s));
  } catch  (NumberFormationException e) {
    return Optional.empty();
  }
}

案例2:綜合案例

現(xiàn)在有個方法,是嘗試從一個屬性映射中獲取某個關鍵詞對應的值,例子代碼如下:

   public static int readDuration(Properties properties, String name) {
        String value = properties.getProperty(name);
        if (value != null) {
            try {
                int i = Integer.parseInt(value);
                if (i > 0) {
                    return i;
                }
            } catch (NumberFormatException e) {

            }
        }
        return 0;
    }

使用Optional的寫法后,代碼如下所示:

    public static int readDurationWithOptional(Properties properties, String name) {
        return Optional.ofNullable(properties.getProperty(name))
            .flatMap(OptionalUtility::stringToInt)
            .filter(integer -> integer > 0)
            .orElse(0);
    }

如果需要訪問的屬性值不存在,Properites.getProperty(String)方法的返回值就是一個null,使用noNullable工廠方法就可以將該值轉換為Optional對象;接下來,可以使用flatMap將一個Optional轉換為Optional對象;最后使用filter過濾掉負數(shù),然后就可以使用orElse獲取屬性值,如果拿不到則返回默認值0。

感謝各位的閱讀!關于“如何使用Optional擺脫NPE的折磨”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


本文名稱:如何使用Optional擺脫NPE的折磨-創(chuàng)新互聯(lián)
本文URL:http://weahome.cn/article/hjpdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部