欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年09月26日 09:02:28   投稿:junjie  
這篇文章主要介紹了Java函數(shù)式編程(六):Optional,本文是系列文章的第6篇,其它文章請參閱本文底部的相關文章,需要的朋友可以參考下

選取單個元素

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

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

復制代碼 代碼如下:

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;
}
}

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

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

復制代碼 代碼如下:

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里面一些強大的功能使得這段代碼更得非常簡潔。首先我們用filter方法獲取了所有滿足條件的元素,然后用了Stream類的findFirst方法選取出了返回集合的第一個元素。這個方法返回的是一個Optional對象,這就是Java里面官方認證的null變量的除臭劑。

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

我們用之前一直在用的friends集合來驗證下我們這個pickName方法。

復制代碼 代碼如下:

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

這段代碼選取出第一個匹配的元素,如果沒找到,打印出一個友好的提示信息。
復制代碼 代碼如下:

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

findFirst()方法和Optinal類的結合使用減少了我們的代碼量,并且看起來感覺還不錯。不過Optional類的功能遠不止這些。比如說,除了當對象不存在的時候能提供一個默認值外,如果結果存在的話還可以用它來運行一段代碼,或者一個lambda表達式,像這樣:
復制代碼 代碼如下:

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

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

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

相關文章

  • Java日常練習題,每天進步一點點(62)

    Java日常練習題,每天進步一點點(62)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • 詳解如何在spring boot中使用spring security防止CSRF攻擊

    詳解如何在spring boot中使用spring security防止CSRF攻擊

    這篇文章主要介紹了詳解如何在spring boot中使用spring security防止CSRF攻擊,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java面試題沖刺第二十六天--實戰(zhàn)編程

    Java面試題沖刺第二十六天--實戰(zhàn)編程

    這篇文章主要為大家分享了最有價值的三道java實戰(zhàn)面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java實現(xiàn)map轉換成json的方法詳解

    Java實現(xiàn)map轉換成json的方法詳解

    這篇文章主要為大家詳細介紹了Java語言實現(xiàn)map轉換成json的幾種方法,文中的示例代碼講解詳細,對我們學習Java有一定幫助,需要的可以參考一下
    2022-05-05
  • SpringBoot集成SpringSecurity和JWT做登陸鑒權的實現(xiàn)

    SpringBoot集成SpringSecurity和JWT做登陸鑒權的實現(xiàn)

    這篇文章主要介紹了SpringBoot集成SpringSecurity和JWT做登陸鑒權的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經歷)

    解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經歷)

    這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot請求發(fā)送與信息響應匹配實現(xiàn)方法介紹

    SpringBoot請求發(fā)送與信息響應匹配實現(xiàn)方法介紹

    這篇文章主要介紹了SpringBoot請求發(fā)送與信息響應匹配實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • Java Web制作登錄驗證碼實現(xiàn)代碼解析

    Java Web制作登錄驗證碼實現(xiàn)代碼解析

    這篇文章主要介紹了Java Web制作登錄驗證碼實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Springboot 集成 lombok.jar過程解析

    Springboot 集成 lombok.jar過程解析

    這篇文章主要介紹了Springboot 集成 lombok.jar過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot整合Mybatis無法掃描xml文件的解決

    SpringBoot整合Mybatis無法掃描xml文件的解決

    這篇文章主要介紹了SpringBoot整合Mybatis無法掃描xml文件的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論