前言
相信大家肯定所有的開發者都對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不為空" ); }); |
大家看,是不是就出現了我們想要的結果,一個判斷 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