激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JDK8中Optional類巧用之判空操作

JDK8中Optional類巧用之判空操作

2021-12-09 10:44Resourceful! Java教程

善用Optional可以使我們代碼中很多繁瑣、丑陋的設計變得十分優雅,這篇文章主要給大家介紹了JDK8中Optional類巧用之判空的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

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

jdk8

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

optional類

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

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

?
1
2
3
4
5
6
7
user user = usersmapper.selectuserbyid(userid);
string username = user.getusername();
   if(user!= null){
       if(username != null && !username.isempty()){
               .....
             }
   }

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

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

?
1
2
3
4
5
6
user user = usersmapper.selectuserbyid(userid);
optional.ofnullable(user)
        .map(user::getusername)
        .ifpresent(username->{
        ....
        }

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

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

?
1
2
3
4
user user = usersmapper.selectuserbyid(userid);
optional<user> useroptional = optional.ofnullable(user);
optional<string> str = useroptional.map(user::getusername);
....

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

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

?
1
2
3
4
5
optional.ofnullable(user)
        .map(user::getusername)
        .ifpresent(username->{
            system.out.println("用戶username不為空");
        });

JDK8中Optional類巧用之判空操作

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

對于 optional 類,在 java8 實戰中給出了很多的方法,阿粉也是給大家摘取了一下,做了個總結,

  • ofnullable 方法 :將指定值用optional封裝之后返回,如果該值為null,則返回一個空的optional對象
  • empty 方法 :返回一個空的optional實例
  • filter 方法 :如果值存在并且滿足提供的謂詞,就返回包含該值的optional對象;否則返回一個空的 optional對象
  • flatmap 方法 :如果值存在,就對該值執行提供的mapping函數調用,返回一個optional類型的值,否則就返 回一個空的optional對象
  • get 方法 :如果該值存在,將該值用optional封裝返回,否則拋出一個nosuchelementexception異常
  • ifpresent 方法 :如果值存在,就執行使用該值的方法調用,否則什么也不做
  • ispresent 方法 :如果值存在就返回true,否則返回false
  • map 方法 :如果值存在,就對該值執行提供的mapping函數調用
  • of 方法 :將指定值用optional封裝之后返回,如果該值為null,則拋出一個nullpointerexception異常
  • orelse 方法:如果有值則將其返回,否則返回一個默認值
  • orelseget 方法 :如果有值則將其返回,否則返回一個由指定的supplier接口生成的值
  • orelsethrow 方法 :如果有值則將其返回,否則拋出一個由指定的supplier接口生成的異常

大家看這些方法是不是都有很多相似的,比如 map,flatmap,還有orelse,orelseget,orelsethrow 方法

map 和 flatmap 比較:

這兩個都是做 轉換值 的操作,區別就是入參的類型不是一樣的,map的入參是 function<? super t, ? extends u> mapper 而 flatmap 入參則是 function<? super t, optional<u> > mapper 。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 表達式實際上就是相當于是一個匿名內部類,他就是讓我們開發的人把函數當成參數傳遞給某個方法,然后把代碼當做數據去處理。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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);
        });

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

va8:

?
1
2
3
arrays.aslist("1", "2", "3").foreach((string st)->{
            system.out.println(st);
        });

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

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

總結

到此這篇關于jdk8中optional類巧用之判空的文章就介紹到這了,更多相關jdk8 optional類判空內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_44866828/article/details/119961399

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 色综合一区二区 | 91久久久国产精品 | 高清av免费 | xxxx69hd一hd| 黄色片免费在线播放 | 亚洲人成综合第一网 | 成年人观看免费视频 | 免费看成人毛片 | freexxx69性欧美hd| 国产成人羞羞视频在线 | 97porn| 精品一区二区三区在线视频 | 国产成人精品免费视频大全最热 | 好吊色欧美一区二区三区四区 | 免费黄色在线电影 | 国产成人在线一区二区 | 日韩视频区 | 欧美中文字幕一区二区三区亚洲 | 国产精品入口夜色视频大尺度 | 四季久久免费一区二区三区四区 | 成人福利在线视频 | 欧美性生视频 | 奶子吧naiziba.cc免费午夜片在线观看 | 欧美成人视 | 99精品视频在线看 | 国产成人在线观看免费网站 | 欧美性生交xxxxx免费观看 | 成人男女啪啪免费观看网站四虎 | h视频免费看 | 色妞视频男女视频 | 综合网日日天干夜夜久久 | av性色全交蜜桃成熟时 | 破处av在线 | 成人在线视频国产 | 香蕉秀 | 操碰在线视频 | 欧美a级大胆视频 | 国产一级一国产一级毛片 | 91成人免费看片 | 性生活视频网站 | 黄色特级视频 |