一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java函數(shù)式編程(六):Optional

Java函數(shù)式編程(六):Optional

2019-12-01 12:42junjie JAVA教程

這篇文章主要介紹了Java函數(shù)式編程(六):Optional,本文是系列文章的第6篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下

選取單個(gè)元素

直覺來說選取單個(gè)元素肯定會(huì)比選取多個(gè)要簡單得多,不過這里也存在一些問題。我們先看下一般的做法的問題是什么,然后再看下如何用lambda表達(dá)式來解決它。

我們先新建一個(gè)方法來查找一個(gè)以特定字母開頭的元素,然后打印出來。

 

復(fù)制代碼代碼如下:

public static void pickName(
final List<String> names, final String startingLetter) {
String foundName = null;
for(String name : names) {
if(name.startsWith(startingLetter)) {
foundName = name;
break;
}
}

 

這個(gè)方法簡直跟剛過去的垃圾車一樣臭不可聞。我們先是新建了一個(gè)foundName的變量,然后初始化成null——這個(gè)就是惡臭之源。我們不得不檢查是否為空,不然的話就會(huì)拋出一個(gè)NullPointerException或者一個(gè)錯(cuò)誤響應(yīng)。我們還用了一個(gè)外部迭代器來循環(huán)列表,如果找到了想要的元素之后還得跳出這個(gè)循環(huán),這又加重了原來的臭味:基本類型偏執(zhí),命令式風(fēng)格,可變性,全齊活了。一旦退出循環(huán)后,我們還得先檢查下結(jié)果,然后才能進(jìn)行打印。這么點(diǎn)任務(wù)居然寫了這么長的代碼。

我們來重新分析下這個(gè)問題。我們只是希望能選出第一個(gè)匹配的元素,并且能安全的處理不存在這樣一個(gè)元素的情況。我們來用lambda表達(dá)式重寫一下這個(gè)pickName方法。

 

復(fù)制代碼代碼如下:

public static void pickName(
final List<String> names, final String startingLetter) {
final Optional<String> foundName =
names.stream()
.filter(name ->name.startsWith(startingLetter))
.findFirst();
System.out.println(String.format("A name starting with %s: %s",
startingLetter, foundName.orElse("No name found")));
}

 

JDK里面一些強(qiáng)大的功能使得這段代碼更得非常簡潔。首先我們用filter方法獲取了所有滿足條件的元素,然后用了Stream類的findFirst方法選取出了返回集合的第一個(gè)元素。這個(gè)方法返回的是一個(gè)Optional對象,這就是Java里面官方認(rèn)證的null變量的除臭劑。

Optional類非常有用,你不用管結(jié)果是不是存在。它使得我們免受空指針異常的煩惱,并且更明確的指明了沒有結(jié)果也是一種可能的結(jié)果。通過isPresent()方法我們可以知道結(jié)果是不是存在,想獲取結(jié)果值的話可以使用get()方法。我們還可以使用(這個(gè)方法名能讓你震驚)orElse方法給它設(shè)置一個(gè)默認(rèn)值,就像前面代碼里的那樣。

我們用之前一直在用的friends集合來驗(yàn)證下我們這個(gè)pickName方法。

復(fù)制代碼代碼如下:

pickName(friends, "N");
pickName(friends, "Z");


這段代碼選取出第一個(gè)匹配的元素,如果沒找到,打印出一個(gè)友好的提示信息。

復(fù)制代碼代碼如下:

A name starting with N: Nate
A name starting with Z: No name found


findFirst()方法和Optinal類的結(jié)合使用減少了我們的代碼量,并且看起來感覺還不錯(cuò)。不過Optional類的功能遠(yuǎn)不止這些。比如說,除了當(dāng)對象不存在的時(shí)候能提供一個(gè)默認(rèn)值外,如果結(jié)果存在的話還可以用它來運(yùn)行一段代碼,或者一個(gè)lambda表達(dá)式,像這樣:

復(fù)制代碼代碼如下:

foundName.ifPresent(name -> System.out.println("Hello " + name));

 

跟命令式的選取第一個(gè)匹配名字的代碼比起來,流式的優(yōu)雅的函數(shù)式風(fēng)格看真來更棒一些。不過這個(gè)調(diào)用流的版本里是不是做的事情有點(diǎn)太多了(譯注:先選出了所有匹配的再返回第一項(xiàng))?當(dāng)然不是,這些方法非常智能,它們可以按需工作(在后面113頁的Stream的惰性求值中我們會(huì)深入探討這點(diǎn))。

選取單個(gè)元素的例子展示了JDK庫更多強(qiáng)大的功能,下面我們來看下lambda表達(dá)式如何根據(jù)一個(gè)集合,來求出一個(gè)想要的值。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 私人黄色影院 | 亚洲 欧美 中文字幕 在线 | 亚洲国产欧美在线人网站 | 亚洲国产第一区二区香蕉日日 | 大乳孕妇一级毛片 | 日韩亚洲一区中文字幕在线 | 成年人黄色录像 | 满城尽带黄金甲大胸片 | 青草青青在线视频 | 精品国产一二三区在线影院 | 日本视频免费在线播放 | 无码中文字幕热热久久 | 成年性香蕉漫画在线观看 | 男人捅女人的鸡鸡 | 猫咪社区免费资源在线观看 | 勾搭已婚高h | 亚洲色图欧美视频 | 亚洲AV精品一区二区三区不卡 | 国产精品区一区二区免费 | www.俺去啦| 亚洲 欧美 国产 在线观看 | 美女gif跪趴式抽搐动态图 | bbbxxx乱大交欧美小说 | 亚洲成av人片在线观看天堂无码 | 成年男女免费视频网站 | 成年人在线观看视频免费 | 欧美靠逼| 舔比小说| pregnanthd产子 | 扒开大腿狠狠挺进视频 | 亚洲精品高清中文字幕完整版 | 九九九国产在线 | 国产精品免费网站 | 欧美一级欧美三级在线 | 美女脱了内裤打开腿让男人图片 | 国产精品久久久久久久久免费观看 | 色屁屁www | 精品亚洲国产一区二区 | 扒开放荡老师裙子猛烈的进入 | 好爽好深好猛好舒服视频上 | 免费精品视频在线 |