摘要:本文簡(jiǎn)單介紹中的最常用法。在業(yè)務(wù)邏輯中使用判斷的值是否為空,可以用方法,例如系統(tǒng)屬性不存在。標(biāo)準(zhǔn)的用法應(yīng)該是用方法。如下所示這樣的語(yǔ)句比判斷簡(jiǎn)潔的多。不過(guò),這個(gè)遺憾在中得到了補(bǔ)足。但同樣,設(shè)計(jì)出來(lái)并不是這么用的。
本文簡(jiǎn)單介紹 Java 8 中 Optional 的最常用法。
創(chuàng)建 Optional創(chuàng)建 Optional 有三個(gè)方法,如下所示:
// 方法1:參數(shù)不能為 null,否則會(huì)拋出異常 OptionalstringOptional = Optional.of("success"); // 方法2:無(wú)法確定參數(shù)是否為 null 時(shí),使用這個(gè)方法 Optional appNameOptional = Optional.ofNullable(System.getProperty("AppName")); // 方法3:需要返回一個(gè)不含值的 Optional 對(duì)象時(shí),使用這個(gè)方法 Optional emptyOptional = Optional.empty();
注意:Optional 對(duì)象的值是不可修改的。在業(yè)務(wù)邏輯中使用 Optional
判斷 Optional 的值是否為空,可以用 isPresent() 方法,例如:
OptionalappNameOptional = Optional.ofNullable(System.getProperty("AppName")); if (!appNameOptional.isPresent()) { System.out.println("系統(tǒng)屬性 AppName 不存在。"); }
但 Optional 設(shè)計(jì)出來(lái)并不是這么用的。標(biāo)準(zhǔn)的用法應(yīng)該是用 ifPresent() 方法。如下所示:
Optional.ofNullable(System.getProperty("AppName")) .ifPresent(appname -> System.out.println("AppName = " + appname));
這樣的語(yǔ)句比 if 判斷簡(jiǎn)潔的多。
Java 8 的 Optional 類并沒(méi)有 ifNotPresent() 這樣的方法。不過(guò),這個(gè)遺憾 在 Java 9 中得到了補(bǔ)足。
從 Optional 對(duì)象取值最簡(jiǎn)單的取值方法就是 get() 方法了,不用什么例子就看得懂。但同樣,Optional 設(shè)計(jì)出來(lái)并不是這么用的。Optional 有更好的取值方法 orElse() 和 orElseGet(),它們甚至用來(lái)代替 if 語(yǔ)句:
// 當(dāng)系統(tǒng)屬性 AppName 不存在時(shí),返回 "DefaultAppName" String appName = Optional .ofNullable(System.getProperty("AppName")) .orElse("DefaultAppName"); // 當(dāng)缺省值需要調(diào)用另外的方法獲得時(shí),可以這樣實(shí)現(xiàn) String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseGet(() -> getFromOtherPlace());
此外如果你希望 Optional 為空時(shí)拋出異常,可以用 orElseThrow() 方法:
String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseThrow(() -> new IllegalStateException("AppName is empty"));生成新的 Optional
前面提到 Optional 的值是不可以改的,但如果當(dāng)前 Optional 對(duì)象的內(nèi)容不是我想要的怎么辦? Optional 提供了幾個(gè)方便的方法,如下所示:
// map() 方法根據(jù)當(dāng)前 Optional 的值生成一個(gè)新的 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);
下面是一個(gè)沒(méi)有用 Optional 的例子:
ListsearchResults = Collections.emptyList(); String keyword = parameters.get("keyword"); if (keyword != null) { String fixedKeyword = "%" + keyword.toUpperCase() + "%"; searchResults = search(fixedKeyword); } System.out.println("搜索結(jié)果:" + searchResults.size() + " 個(gè)");
用了 Optional 之后:
ListsearchResults = Optional .ofNullable(parameters.get("keyword")) .map(keyword -> "%" + keyword.toUpperCase() + "%") .map(fixedKeyword -> search(fixedKeyword)) .orElse(Collections.emptyList()); System.out.println("搜索結(jié)果:" + searchResults.size() + " 個(gè)");
當(dāng)然,上面這個(gè)例子中,兩個(gè) map() 方法可以寫(xiě)在一起,這個(gè)可以根據(jù)自己的喜好來(lái)了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70120.html
摘要:概述簡(jiǎn)介類是一個(gè)容器類,代表一個(gè)值存在或不存在,原來(lái)用表示一個(gè)值不存在,現(xiàn)在可以更好的表達(dá)這個(gè)概念,并且可以避免空指針異常。否則返回字符串長(zhǎng)度為與類似,要求返回值必須是字符串長(zhǎng)度為本文首發(fā)于凌風(fēng)博客新特性之類作者凌風(fēng) 1. 概述 1.1 簡(jiǎn)介 Optional 類(java.util.Optional)是一個(gè)容器類,代表一個(gè)值存在或不存在,原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在 Op...
摘要:比如,你可以建立一個(gè),選出熱量超過(guò)卡路里的頭三道菜請(qǐng)注意也可以用在無(wú)序流上,比如源是一個(gè)。跳過(guò)元素流還支持方法,返回一個(gè)扔掉了前個(gè)元素的流。一般來(lái)說(shuō),應(yīng)該使用來(lái)對(duì)這種流加以限制,以避免打印無(wú)窮多個(gè)值。 一、篩選和切片 1.用謂詞篩選 Streams接口支持filter方法。該操作會(huì)接受一個(gè)謂詞(一個(gè)返回boolean的函數(shù))作為參數(shù),并返回一個(gè)包括所有符合謂詞的元素的流。例如篩選出所有...
摘要:但有一個(gè)限制它們不能修改定義的方法的局部變量的內(nèi)容。如前所述,這種限制存在的原因在于局部變量保存在棧上,并且隱式表示它們僅限于其所在線程。 2014年,Oracle發(fā)布了Java8新版本。對(duì)于Java來(lái)說(shuō),這顯然是一個(gè)具有里程碑意義的版本。尤其是那函數(shù)式編程的功能,避開(kāi)了Java那煩瑣的語(yǔ)法所帶來(lái)的麻煩。 這可以算是一篇Java8的學(xué)習(xí)筆記。將Java8一些常見(jiàn)的一些特性作了一個(gè)概要的...
摘要:簡(jiǎn)而言之,提供了一種高效且易于使用的處理數(shù)據(jù)的方式。和以前的操作不同,操作還有兩個(gè)基礎(chǔ)的特征中間操作都會(huì)返回流對(duì)象本身。注意自己不會(huì)存儲(chǔ)元素不會(huì)改變?cè)磳?duì)象,相反,它們會(huì)返回一個(gè)持有結(jié)果的新操作時(shí)延遲執(zhí)行的。為集合創(chuàng)建并行流。 1. 概述 1.1 簡(jiǎn)介 Java 8 中有兩大最為重要的改革,第一個(gè)是 Lambda 表達(dá)式,另外一個(gè)則是 Stream API(java.util.strea...
閱讀 1745·2021-11-22 15:33
閱讀 2135·2021-10-08 10:04
閱讀 3575·2021-08-27 13:12
閱讀 3448·2019-08-30 13:06
閱讀 1492·2019-08-29 16:43
閱讀 1418·2019-08-29 16:40
閱讀 814·2019-08-29 16:15
閱讀 2774·2019-08-29 14:13