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

JDK8中Optional類(lèi)巧用之判空操作

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

前言

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

JDK8

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

Optional類(lèi)

這個(gè)類(lèi)對(duì)于大家來(lái)說(shuō),是一個(gè)非常重要的類(lèi),不知道大家有沒(méi)有被 java.lang.NullPointerException 瘋狂的折磨過(guò),不管是新人開(kāi)發(fā)還是老開(kāi)發(fā),遇到這個(gè)問(wèn)題的時(shí)候,都是頭大的很,因?yàn)槲覀円诖a里面去瘋狂的判斷是否是null,如果不是 null 需要怎么處理,如果是 null 需要怎么處理,反正就是你要是想解決 java.lang.NullPointerException 這個(gè)問(wèn)題,就免不了去加一些判斷條件,而 Optional 這個(gè)類(lèi),則是幫你優(yōu)雅的處理 null 的問(wèn)題。

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

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

阿粉相信大家一定都寫(xiě)過(guò)這個(gè)樣子的代碼,因?yàn)槲覀儾恢繱QL查詢(xún)出來(lái)的數(shù)據(jù)中是否包含了我們的 Users 對(duì)象,如果要是 Users 對(duì)象,那么就會(huì)無(wú)情的出現(xiàn) java.lang.NullPointerException 這個(gè)空指針異常,這時(shí)候就很尷尬了,老開(kāi)發(fā)一臉懵逼,我竟然還有的地方?jīng)]有驗(yàn)證?

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

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

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

相信大家肯定都看過(guò)一些教程,上面會(huì)寫(xiě)到:

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

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

如果大家不信,我們可以來(lái)運(yùn)行一下我們的代碼,然后看一下效果。

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

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

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

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

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

map 和 flatMap 比較:

這兩個(gè)都是做 轉(zhuǎn)換值 的操作,區(qū)別就是入?yún)⒌念?lèi)型不是一樣的,map的入?yún)⑹?Function<? super T, ? extends U> mapper 而 flatMap 入?yún)t是 Function<? super T, Optional<U> > mapper 。

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

這么一看總是感覺(jué)不太對(duì)的樣子,我們?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 方法會(huì)使用 Optional.ofNullable 將其包裝為 Optional;而 flatMap 要求參數(shù)中的函數(shù) mapper 輸出的就是 Optional。

一個(gè)是比較聰明的,另外一個(gè)就相對(duì)來(lái)說(shuō)不是那么聰明了,人家會(huì)自己包裝呀,是不是?

同樣的比較還有 orElse,orElseGet,orElseThrow 但是這個(gè)阿粉就不再給大家絮叨了,因?yàn)樯厦娴姆椒ń忉屔隙己苊黠@的能看到了。

Lambda 表達(dá)式

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

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

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

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

va8:

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

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

Java8 實(shí)際上在從發(fā)布開(kāi)始,很多公司都在用,但是也有很多人依舊選擇是 Java7,因?yàn)椴幌敫淖冏约旱膶W(xué)習(xí)風(fēng)格,阿粉相信大家如果是一個(gè)決心在開(kāi)發(fā)領(lǐng)域一直做下去的人,那么肯定會(huì)保持一個(gè)不斷學(xué)習(xí)的心,所以,你是這樣的人么?

總結(jié)

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

相關(guān)文章

  • Java中static關(guān)鍵字的作用和用法詳細(xì)介紹

    Java中static關(guān)鍵字的作用和用法詳細(xì)介紹

    這篇文章主要介紹了Java中static關(guān)鍵字的作用和用法詳細(xì)介紹,本文講解了static變量、靜態(tài)方法、static代碼塊、static和final一塊用等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法分析

    微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法分析

    這篇文章主要介紹了微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法,結(jié)合實(shí)例形式分析了微信簽名錯(cuò)誤問(wèn)題相關(guān)解決方法,需要的朋友可以參考下
    2019-04-04
  • Java中出現(xiàn)java.lang.IllegalStateException異常錯(cuò)誤的解決

    Java中出現(xiàn)java.lang.IllegalStateException異常錯(cuò)誤的解決

    這篇文章主要介紹了Java中出現(xiàn)java.lang.IllegalStateException異常錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 深入理解Spring事務(wù)原理

    深入理解Spring事務(wù)原理

    這篇文章主要帶領(lǐng)大家深入理解Spring事務(wù)原理,Spring事務(wù)的傳播屬性
    2016-07-07
  • SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    在寫(xiě)SpringMVC項(xiàng)目時(shí),由于要對(duì)表單數(shù)據(jù)進(jìn)行校驗(yàn),需要使用@Valid進(jìn)行校驗(yàn),但是在進(jìn)行數(shù)據(jù)校驗(yàn)時(shí),BindingResult對(duì)象無(wú)法攔截非法表單數(shù)據(jù),result.hasErrors()無(wú)論怎么輸入都會(huì)返回false,本文詳細(xì)的介紹一下解決方法
    2021-09-09
  • Java內(nèi)存模型JMM詳解

    Java內(nèi)存模型JMM詳解

    這篇文章主要介紹了Java內(nèi)存模型JMM詳解,涉及volatile和監(jiān)視器鎖,final字段,內(nèi)存屏障等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 深入解析SpringBatch適配器

    深入解析SpringBatch適配器

    Spring Batch是Spring的一個(gè)子項(xiàng)目,使用Java語(yǔ)言并基于Spring框架為基礎(chǔ)開(kāi)發(fā),使得已經(jīng)使用 Spring 框架的開(kāi)發(fā)者或者企業(yè)更容易訪問(wèn)和利用企業(yè)服務(wù),本文給大家介紹SpringBatch適配器的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-11-11
  • Spring Boot 項(xiàng)目啟動(dòng)自動(dòng)執(zhí)行方法的兩種實(shí)現(xiàn)方式

    Spring Boot 項(xiàng)目啟動(dòng)自動(dòng)執(zhí)行方法的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了Spring Boot 項(xiàng)目啟動(dòng)自動(dòng)執(zhí)行方法的兩種實(shí)現(xiàn)方式,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot框架,感興趣的朋友可以了解下
    2021-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)

    Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(動(dòng)力節(jié)點(diǎn)之Java學(xué)院整理)的相關(guān)資料,包括創(chuàng)建和內(nèi)存分配,數(shù)組封裝后的使用等,需要的朋友參考下吧
    2017-04-04
  • Java 匿名對(duì)象與匿名內(nèi)部類(lèi)的使用

    Java 匿名對(duì)象與匿名內(nèi)部類(lèi)的使用

    很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類(lèi)的寫(xiě)法有點(diǎn)陌生,本文主要介紹了Java 匿名對(duì)象與匿名內(nèi)部類(lèi)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01

最新評(píng)論