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

JDK8中Optional類巧用之判空操作

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

前言

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

JDK8

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

Optional類

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

我們先看一組 Java7 中的一些判斷空的實現:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

map 和 flatMap 比較:

這兩個都是做 轉換值 的操作,區(qū)別就是入參的類型不是一樣的,map的入參是 Function<? super T, ? extends U> mapper 而 flatMap 入參則是 Function<? super T, Optional<U> > mapper 。

入參的不同也就導致了他們獲取返回值也是不同的,map中獲取的返回值自動被Optional包裝,flatMap中返回值保持不變,但必須是Optional類型。

這么一看總是感覺不太對的樣子,我們去源碼里面看看是什么樣子的。

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 方法參數中的函數 mapper 輸出的是值,然后 map 方法會使用 Optional.ofNullable 將其包裝為 Optional;而 flatMap 要求參數中的函數 mapper 輸出的就是 Optional。

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

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

Lambda 表達式

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

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

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,因為不想改變自己的學習風格,阿粉相信大家如果是一個決心在開發(fā)領域一直做下去的人,那么肯定會保持一個不斷學習的心,所以,你是這樣的人么?

總結

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

相關文章

  • Java中static關鍵字的作用和用法詳細介紹

    Java中static關鍵字的作用和用法詳細介紹

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

    微信js sdk invalid signature簽名錯誤問題的解決方法分析

    這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結合實例形式分析了微信簽名錯誤問題相關解決方法,需要的朋友可以參考下
    2019-04-04
  • Java中出現java.lang.IllegalStateException異常錯誤的解決

    Java中出現java.lang.IllegalStateException異常錯誤的解決

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

    深入理解Spring事務原理

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

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

    在寫SpringMVC項目時,由于要對表單數據進行校驗,需要使用@Valid進行校驗,但是在進行數據校驗時,BindingResult對象無法攔截非法表單數據,result.hasErrors()無論怎么輸入都會返回false,本文詳細的介紹一下解決方法
    2021-09-09
  • Java內存模型JMM詳解

    Java內存模型JMM詳解

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

    深入解析SpringBatch適配器

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

    Spring Boot 項目啟動自動執(zhí)行方法的兩種實現方式

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

    Java數據結構之數組(動力節(jié)點之Java學院整理)

    這篇文章主要介紹了Java數據結構之數組(動力節(jié)點之Java學院整理)的相關資料,包括創(chuàng)建和內存分配,數組封裝后的使用等,需要的朋友參考下吧
    2017-04-04
  • Java 匿名對象與匿名內部類的使用

    Java 匿名對象與匿名內部類的使用

    很多小伙伴對匿名對象和匿名內部類的寫法有點陌生,本文主要介紹了Java 匿名對象與匿名內部類的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01

最新評論