Java 8 Optional 簡介

本文簡單介紹 Java 8 中 Optional 的最經常使用法。html

建立 Optional

建立 Optional 有三個方法,以下所示:java

// 方法1:參數不能爲 null,不然會拋出異常
Optional<String> stringOptional = Optional.of("success");  

// 方法2:沒法肯定參數是否爲 null 時,使用這個方法
Optional<String> appNameOptional = Optional.ofNullable(System.getProperty("AppName"));

// 方法3:須要返回一個不含值的 Optional 對象時,使用這個方法
Optional<String> emptyOptional = Optional.empty();
注意: Optional 對象的值是不可修改的。

在業務邏輯中使用 Optional

判斷 Optional 的值是否爲空,能夠用 isPresent() 方法,例如:api

Optional<String> appNameOptional = 
        Optional.ofNullable(System.getProperty("AppName"));
        
if (!appNameOptional.isPresent()) {
    System.out.println("系統屬性 AppName 不存在。");
}

Optional 設計出來並非這麼用的。標準的用法應該是用 ifPresent() 方法。以下所示:oracle

Optional.ofNullable(System.getProperty("AppName"))
        .ifPresent(appname -> System.out.println("AppName = " + appname));

這樣的語句比 if 判斷簡潔的多。app

Java 8 的 Optional 類並無 ifNotPresent() 這樣的方法。不過,這個遺憾 在 Java 9 中獲得了補足設計

從 Optional 對象取值

最簡單的取值方法就是 get() 方法了,不用什麼例子就看得懂。但一樣,Optional 設計出來並非這麼用的。Optional 有更好的取值方法 orElse()orElseGet(),它們甚至用來代替 if 語句:code

// 當系統屬性 AppName 不存在時,返回 "DefaultAppName"
String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElse("DefaultAppName");
        
// 當缺省值須要調用另外的方法得到時,能夠這樣實現
String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElseGet(() -> getFromOtherPlace());

此外若是你但願 Optional 爲空時拋出異常,能夠用 orElseThrow() 方法:htm

String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElseThrow(() -> new IllegalStateException("AppName is empty"));

生成新的 Optional

前面提到 Optional 的值是不能夠改的,但若是當前 Optional 對象的內容不是我想要的怎麼辦? Optional 提供了幾個方便的方法,以下所示:對象

// map() 方法根據當前 Optional 的值生成一個新的 Optional
Optional<String> message = Optional
        .ofNullable(System.getProperty("AppName"))
        .map(appname -> "App name is " + appname);
        
// filter() 方法檢查 Optional 的值是否知足條件,若是
// 知足則返回自身,不然返回 Optional.empty()
Optional<String> message = Optional
        .ofNullable(System.getProperty("AppName"))
        .filter(appname -> appname.length() > 0);

綜合示例:

下面是一個沒有用 Optional 的例子:get

List<String> searchResults = Collections.emptyList();
String keyword = parameters.get("keyword");

if (keyword != null) {
    String fixedKeyword = "%" + keyword.toUpperCase() + "%";
    searchResults = search(fixedKeyword);
}

System.out.println("搜索結果:" + searchResults.size() + " 個");

用了 Optional 以後:

List<String> searchResults = Optional
        .ofNullable(parameters.get("keyword"))
        .map(keyword -> "%" + keyword.toUpperCase() + "%")
        .map(fixedKeyword -> search(fixedKeyword))
        .orElse(Collections.emptyList());

System.out.println("搜索結果:" + searchResults.size() + " 個");

固然,上面這個例子中,兩個 map() 方法能夠寫在一塊兒,這個能夠根據本身的喜愛來了。

相關文章
相關標籤/搜索