摘要:本文簡單介紹中的最常用法。在業務邏輯中使用判斷的值是否為空,可以用方法,例如系統屬性不存在。標準的用法應該是用方法。如下所示這樣的語句比判斷簡潔的多。不過,這個遺憾在中得到了補足。但同樣,設計出來并不是這么用的。
本文簡單介紹 Java 8 中 Optional 的最常用法。
創建 Optional創建 Optional 有三個方法,如下所示:
// 方法1:參數不能為 null,否則會拋出異常 OptionalstringOptional = Optional.of("success"); // 方法2:無法確定參數是否為 null 時,使用這個方法 Optional appNameOptional = Optional.ofNullable(System.getProperty("AppName")); // 方法3:需要返回一個不含值的 Optional 對象時,使用這個方法 Optional emptyOptional = Optional.empty();
注意:Optional 對象的值是不可修改的。在業務邏輯中使用 Optional
判斷 Optional 的值是否為空,可以用 isPresent() 方法,例如:
OptionalappNameOptional = Optional.ofNullable(System.getProperty("AppName")); if (!appNameOptional.isPresent()) { System.out.println("系統屬性 AppName 不存在。"); }
但 Optional 設計出來并不是這么用的。標準的用法應該是用 ifPresent() 方法。如下所示:
Optional.ofNullable(System.getProperty("AppName")) .ifPresent(appname -> System.out.println("AppName = " + appname));
這樣的語句比 if 判斷簡潔的多。
Java 8 的 Optional 類并沒有 ifNotPresent() 這樣的方法。不過,這個遺憾 在 Java 9 中得到了補足。
從 Optional 對象取值最簡單的取值方法就是 get() 方法了,不用什么例子就看得懂。但同樣,Optional 設計出來并不是這么用的。Optional 有更好的取值方法 orElse() 和 orElseGet(),它們甚至用來代替 if 語句:
// 當系統屬性 AppName 不存在時,返回 "DefaultAppName" String appName = Optional .ofNullable(System.getProperty("AppName")) .orElse("DefaultAppName"); // 當缺省值需要調用另外的方法獲得時,可以這樣實現 String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseGet(() -> getFromOtherPlace());
此外如果你希望 Optional 為空時拋出異常,可以用 orElseThrow() 方法:
String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseThrow(() -> new IllegalStateException("AppName is empty"));生成新的 Optional
前面提到 Optional 的值是不可以改的,但如果當前 Optional 對象的內容不是我想要的怎么辦? Optional 提供了幾個方便的方法,如下所示:
// map() 方法根據當前 Optional 的值生成一個新的 Optional Optional綜合示例:message = Optional .ofNullable(System.getProperty("AppName")) .map(appname -> "App name is " + appname); // filter() 方法檢查 Optional 的值是否滿足條件,如果 // 滿足則返回自身,否則返回 Optional.empty() Optional message = Optional .ofNullable(System.getProperty("AppName")) .filter(appname -> appname.length() > 0);
下面是一個沒有用 Optional 的例子:
ListsearchResults = Collections.emptyList(); String keyword = parameters.get("keyword"); if (keyword != null) { String fixedKeyword = "%" + keyword.toUpperCase() + "%"; searchResults = search(fixedKeyword); } System.out.println("搜索結果:" + searchResults.size() + " 個");
用了 Optional 之后:
ListsearchResults = Optional .ofNullable(parameters.get("keyword")) .map(keyword -> "%" + keyword.toUpperCase() + "%") .map(fixedKeyword -> search(fixedKeyword)) .orElse(Collections.emptyList()); System.out.println("搜索結果:" + searchResults.size() + " 個");
當然,上面這個例子中,兩個 map() 方法可以寫在一起,這個可以根據自己的喜好來了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70120.html
摘要:概述簡介類是一個容器類,代表一個值存在或不存在,原來用表示一個值不存在,現在可以更好的表達這個概念,并且可以避免空指針異常。否則返回字符串長度為與類似,要求返回值必須是字符串長度為本文首發于凌風博客新特性之類作者凌風 1. 概述 1.1 簡介 Optional 類(java.util.Optional)是一個容器類,代表一個值存在或不存在,原來用 null 表示一個值不存在,現在 Op...
摘要:比如,你可以建立一個,選出熱量超過卡路里的頭三道菜請注意也可以用在無序流上,比如源是一個。跳過元素流還支持方法,返回一個扔掉了前個元素的流。一般來說,應該使用來對這種流加以限制,以避免打印無窮多個值。 一、篩選和切片 1.用謂詞篩選 Streams接口支持filter方法。該操作會接受一個謂詞(一個返回boolean的函數)作為參數,并返回一個包括所有符合謂詞的元素的流。例如篩選出所有...
摘要:簡而言之,提供了一種高效且易于使用的處理數據的方式。和以前的操作不同,操作還有兩個基礎的特征中間操作都會返回流對象本身。注意自己不會存儲元素不會改變源對象,相反,它們會返回一個持有結果的新操作時延遲執行的。為集合創建并行流。 1. 概述 1.1 簡介 Java 8 中有兩大最為重要的改革,第一個是 Lambda 表達式,另外一個則是 Stream API(java.util.strea...
閱讀 1714·2021-11-22 15:33
閱讀 2085·2021-10-08 10:04
閱讀 3543·2021-08-27 13:12
閱讀 3419·2019-08-30 13:06
閱讀 1467·2019-08-29 16:43
閱讀 1392·2019-08-29 16:40
閱讀 786·2019-08-29 16:15
閱讀 2746·2019-08-29 14:13