最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDK8中Optional類巧用之判空操作

 更新時間:2021年08月29日 13:09:16   作者:Resourceful!  
善用Optional可以使我們代碼中很多繁瑣、丑陋的設(shè)計變得十分優(yōu)雅,這篇文章主要給大家介紹了JDK8中Optional類巧用之判空的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

相信大家肯定所有的開發(fā)者都對Java8里面的所有的東西都感興趣,雖然目前的 JDK 已經(jīng)更新到 JDK17 了,但是我相信,現(xiàn)在很多公司使用的還都是 JDK8 甚至是 JDK7,但是,就算是有些公司已經(jīng)升級到 JDK8 但是對于 JDK8 里面的一些東西的使用,卻沒有使用的淋漓盡致。 今天就給大家放出幾個 JDK8 里面比較好用的。

JDK8

大家都是知道 JDK8 就開始使用 Lambda 表達(dá)式,但是很多不管是在教程上還是在其他的書籍上,都沒有說在實際開發(fā)的時候去使用上這個 Lambda 表達(dá)式,而且包括 JDK8 里面的一些新的類,也都沒有引入,所以阿粉在這里想要給大家安利一波使用方面的知識。

Optional類

這個類對于大家來說,是一個非常重要的類,不知道大家有沒有被 java.lang.NullPointerException 瘋狂的折磨過,不管是新人開發(fā)還是老開發(fā),遇到這個問題的時候,都是頭大的很,因為我們要在代碼里面去瘋狂的判斷是否是null,如果不是 null 需要怎么處理,如果是 null 需要怎么處理,反正就是你要是想解決 java.lang.NullPointerException 這個問題,就免不了去加一些判斷條件,而 Optional 這個類,則是幫你優(yōu)雅的處理 null 的問題。

我們先看一組 Java7 中的一些判斷空的實現(xiàn):

 User user = usersMapper.selectUserById(userId);
 String userName = user.getUserName();
    if(user!= null){
        if(userName != null && !userName.isEmpty()){
                .....
              }
    }

阿粉相信大家一定都寫過這個樣子的代碼,因為我們不知道SQL查詢出來的數(shù)據(jù)中是否包含了我們的 Users 對象,如果要是 Users 對象,那么就會無情的出現(xiàn) java.lang.NullPointerException 這個空指針異常,這時候就很尷尬了,老開發(fā)一臉懵逼,我竟然還有的地方?jīng)]有驗證?

但是驗證了之后,你就會發(fā)現(xiàn)代碼量是非常的大,而且有點不太美觀,我們再來對比一下 JDK8 中,給我們提供的方法來進(jìn)行驗證的方式。

User user = usersMapper.selectUserById(userId);
Optional.ofNullable(user)
        .map(User::getUserName)
        .ifPresent(userName->{
        ....
        }

大家看這種鏈?zhǔn)骄幊蹋琽fNullable() 方法給我們提供了判斷 user 是不是空,并且去校驗 userName,如果存在,然后執(zhí)行下面的邏輯,相比較 JDK7 的內(nèi)容,相信大家看起來的話肯定是沒有 JDK7 中的表現(xiàn)的那么的明顯,但是大家看代碼是不是發(fā)現(xiàn)已經(jīng)被處理的妥妥的了。而且非常的優(yōu)雅。

相信大家肯定都看過一些教程,上面會寫到:

    User user = usersMapper.selectUserById(userId);
    Optional<User> userOptional = Optional.ofNullable(user);
    Optional<String> str = userOptional.map(User::getUserName);
    ....

但是相對于代碼的可讀性來說,我們肯定還是希望使用 JDK7 上面的判斷來進(jìn)行判斷,但是這種 JDK8 的鏈?zhǔn)骄幊?,在一定程度上減少了代碼量,并且開發(fā)效率也會相對應(yīng)的提升。

如果大家不信,我們可以來運行一下我們的代碼,然后看一下效果。

Optional.ofNullable(user)
        .map(User::getUserName)
        .ifPresent(userName->{
            System.out.println("用戶UserName不為空");
        });

大家看,是不是就出現(xiàn)了我們想要的結(jié)果,一個判斷 null 的操作,瞬間變得高大上了,而且代碼的逼格瞬間上升一個檔次。

對于 Optional 類,在 Java8 實戰(zhàn)中給出了很多的方法,阿粉也是給大家摘取了一下,做了個總結(jié),

  • ofNullable 方法 :將指定值用Optional封裝之后返回,如果該值為null,則返回一個空的Optional對象
  • empty 方法 :返回一個空的Optional實例
  • filter 方法 :如果值存在并且滿足提供的謂詞,就返回包含該值的Optional對象;否則返回一個空的 Optional對象
  • flatMap 方法 :如果值存在,就對該值執(zhí)行提供的mapping函數(shù)調(diào)用,返回一個Optional類型的值,否則就返 回一個空的Optional對象
  • get 方法 :如果該值存在,將該值用Optional封裝返回,否則拋出一個NoSuchElementException異常
  • ifPresent 方法 :如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么也不做
  • isPresent 方法 :如果值存在就返回true,否則返回false
  • map 方法 :如果值存在,就對該值執(zhí)行提供的mapping函數(shù)調(diào)用
  • of 方法 :將指定值用Optional封裝之后返回,如果該值為null,則拋出一個NullPointerException異常
  • orElse 方法:如果有值則將其返回,否則返回一個默認(rèn)值
  • orElseGet 方法 :如果有值則將其返回,否則返回一個由指定的Supplier接口生成的值
  • orElseThrow 方法 :如果有值則將其返回,否則拋出一個由指定的Supplier接口生成的異常

大家看這些方法是不是都有很多相似的,比如 map,flatMap,還有orElse,orElseGet,orElseThrow 方法

map 和 flatMap 比較:

這兩個都是做 轉(zhuǎn)換值 的操作,區(qū)別就是入?yún)⒌念愋筒皇且粯拥?,map的入?yún)⑹?Function<? super T, ? extends U> mapper 而 flatMap 入?yún)t是 Function<? super T, Optional<U> > mapper 。

入?yún)⒌牟煌簿蛯?dǎo)致了他們獲取返回值也是不同的,map中獲取的返回值自動被Optional包裝,flatMap中返回值保持不變,但必須是Optional類型。

這么一看總是感覺不太對的樣子,我們?nèi)ピ创a里面看看是什么樣子的。

map:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }


flatMap:

 public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }

map 方法參數(shù)中的函數(shù) mapper 輸出的是值,然后 map 方法會使用 Optional.ofNullable 將其包裝為 Optional;而 flatMap 要求參數(shù)中的函數(shù) mapper 輸出的就是 Optional。

一個是比較聰明的,另外一個就相對來說不是那么聰明了,人家會自己包裝呀,是不是?

同樣的比較還有 orElse,orElseGet,orElseThrow 但是這個阿粉就不再給大家絮叨了,因為上面的方法解釋上都很明顯的能看到了。

Lambda 表達(dá)式

Lambda 表達(dá)式實際上就是相當(dāng)于是一個匿名內(nèi)部類,他就是讓我們開發(fā)的人把函數(shù)當(dāng)成參數(shù)傳遞給某個方法,然后把代碼當(dāng)做數(shù)據(jù)去處理。

阿粉相信大家肯定都了解這塊,就比如說下面的代碼對比:

Java7:

    List<String> stringList = Arrays.asList("1", "2", "3");
        for (String st:stringList) {
            System.out.println(st);
        }

Java8:

Arrays.asList("1", "2", "3").forEach((String st)->{
            System.out.println(st);
        });

同樣的一個循環(huán),我們肯定想用第二種寫法不是么?

va8:

Arrays.asList("1", "2", "3").forEach((String st)->{
            System.out.println(st);
        });

同樣的一個循環(huán),我們肯定想用第二種寫法不是么?

Java8 實際上在從發(fā)布開始,很多公司都在用,但是也有很多人依舊選擇是 Java7,因為不想改變自己的學(xué)習(xí)風(fēng)格,阿粉相信大家如果是一個決心在開發(fā)領(lǐng)域一直做下去的人,那么肯定會保持一個不斷學(xué)習(xí)的心,所以,你是這樣的人么?

總結(jié)

到此這篇關(guān)于JDK8中Optional類巧用之判空的文章就介紹到這了,更多相關(guān)JDK8 Optional類判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?方法的重載與參數(shù)傳遞詳解

    Java?方法的重載與參數(shù)傳遞詳解

    在java中,方法就是用來完成解決某件事情或?qū)崿F(xiàn)某個功能的辦法。方法實現(xiàn)的過程中,會包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計算數(shù)值,這篇文章我們來探究一下方法的重載與傳參
    2022-04-04
  • MyBatis中多對多關(guān)系的映射和查詢

    MyBatis中多對多關(guān)系的映射和查詢

    本文主要介紹了MyBatis中多對多關(guān)系的映射和查詢的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • springmvc如何使用map接收參數(shù)

    springmvc如何使用map接收參數(shù)

    這篇文章主要介紹了springmvc如何使用map接收參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Hibernate中Session.get()方法和load()方法的詳細(xì)比較

    Hibernate中Session.get()方法和load()方法的詳細(xì)比較

    今天小編就為大家分享一篇關(guān)于Hibernate中Session.get()方法和load()方法的詳細(xì)比較,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java 基礎(chǔ)教程之多線程詳解及簡單實例

    java 基礎(chǔ)教程之多線程詳解及簡單實例

    這篇文章主要介紹了java 基礎(chǔ)教程之多線程詳解及簡單實例的相關(guān)資料,線程的基本屬性、如何創(chuàng)建線程、線程的狀態(tài)切換以及線程通信,需要的朋友可以參考下
    2017-03-03
  • AbstractProcessor擴(kuò)展MapStruct自動生成實體映射工具類

    AbstractProcessor擴(kuò)展MapStruct自動生成實體映射工具類

    這篇文章主要為大家介紹了AbstractProcessor擴(kuò)展MapStruct自動生成實體映射工具類實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java異常類型及處理

    Java異常類型及處理

    這篇文章主要介紹了Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 解析Java中的隊列和用LinkedList集合模擬隊列的方法

    解析Java中的隊列和用LinkedList集合模擬隊列的方法

    這篇文章主要介紹了解析Java中的隊列和用LinkedList集合模擬隊列的方法,相關(guān)算法的實現(xiàn)也是ACM中的常見題目,需要的朋友可以參考下
    2015-08-08
  • Spring使用AOP完成統(tǒng)一結(jié)果封裝實例demo

    Spring使用AOP完成統(tǒng)一結(jié)果封裝實例demo

    這篇文章主要介紹了Spring使用AOP完成統(tǒng)一結(jié)果封裝,本文通過實現(xiàn)demo給大家詳細(xì)講解,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • SpringBoot監(jiān)聽?wèi)?yīng)用程序啟動的生命周期事件的四種方法

    SpringBoot監(jiān)聽?wèi)?yīng)用程序啟動的生命周期事件的四種方法

    在 Spring Boot 中,監(jiān)聽?wèi)?yīng)用程序啟動的生命周期事件有多種方法,本文給大家就介紹了四種監(jiān)聽?wèi)?yīng)用程序啟動的生命周期事件的方法,并通過代碼示例講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-07-07

最新評論

临漳县| 弥勒县| 遵化市| 宜川县| 吴江市| 区。| 淳安县| 桂平市| 南江县| 上饶市| 溧水县| 清新县| 舞阳县| 库车县| 中西区| 望江县| 平遥县| 巴彦淖尔市| 济源市| 含山县| 万荣县| 胶南市| 北川| 贵南县| 景谷| 南康市| 寿宁县| 兰西县| 交城县| 上高县| 天津市| 望江县| 南郑县| 拉孜县| 林口县| 融水| 海伦市| 三台县| 丰宁| 凯里市| 榆社县|