成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 8 Optional 簡(jiǎn)介

waltr / 494人閱讀

摘要:本文簡(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ì)拋出異常
Optional stringOptional = 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() 方法,例如:

Optional appNameOptional = 
        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 的例子:

List searchResults = 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 之后:

List searchResults = 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

相關(guān)文章

  • Java 8 新特性之Optional

    摘要:概述簡(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...

    Little_XM 評(píng)論0 收藏0
  • java 8 實(shí)戰(zhàn)》讀書(shū)筆記 -第五章 使用流

    摘要:比如,你可以建立一個(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è)包括所有符合謂詞的元素的流。例如篩選出所有...

    Richard_Gao 評(píng)論0 收藏0
  • Java8學(xué)習(xí)小記

    摘要:但有一個(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è)概要的...

    CHENGKANG 評(píng)論0 收藏0
  • Java 8 新特性之Stream API

    摘要:簡(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...

    cooxer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<