本文簡單介紹 Java 8 中 Optional
的最經常使用法。html
建立 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 的值是否爲空,能夠用 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 中獲得了補足。設計
最簡單的取值方法就是 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
提供了幾個方便的方法,以下所示:對象
// 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()
方法能夠寫在一塊兒,這個能夠根據本身的喜愛來了。