淺談Java編程之if-else的優(yōu)化技巧總結(jié)
一、使用策略枚舉來(lái)優(yōu)化if-else
看到網(wǎng)上蠻多人推薦使用策略模式來(lái)優(yōu)化if-else,但我總覺得,搞一堆策略類來(lái)優(yōu)化大批量if-else,雖然想法很好,但無(wú)意之中很可能又會(huì)創(chuàng)造出很多類對(duì)象,就顯得過(guò)于繁重了。若想使用策略模式來(lái)優(yōu)化大批量if-else,其實(shí)有一種更好的方式,這是策略模式+枚舉方式的改良,我以前寫過(guò)這樣一篇優(yōu)化文章,詳細(xì)直接點(diǎn)擊該文了解《策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢(shì)》
二、使用三目運(yùn)算符來(lái)優(yōu)化if-else
1、根據(jù)if-else條件來(lái)判斷賦值的,如:
String id="";
if(flag){
id="a";
}else{
id="b";
}
利用三目運(yùn)算符,可以直接優(yōu)化成一行代碼:
id=flag?"a":"b";
2、利用if-else條件來(lái)判斷調(diào)用方法,如:
Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();
if(flag){
set1.add(id);
}else{
set2.add(id);
}
利用三目運(yùn)算符,可以直接優(yōu)化成:
Set<String> set1=new HashSet<>(); Set<String> set2=new HashSet<>(); (flag?set1:set2).add(id);
三、使用Stream優(yōu)化if中判斷條件過(guò)多情況
Jdk1.8新特性Stream流有三個(gè)這樣API,anyMatch,allMatch,noneMatch,各自的作用如下:
- anyMatch:判斷條件里任意一個(gè)滿足條件,則返回true;
- allMatch:判斷條件里所有都滿足條件,則返回true;
- noneMatch:判斷條件里所有都不滿足條件,則返回true;
它們的使用方式其實(shí)很簡(jiǎn)單:
List<String> list = Arrays.asList("a", "b", "c","d", "");
//任意一個(gè)字符串判斷不為空則為true
boolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s));
//所有字符串判斷都不為空則為true
boolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s));
//沒(méi)有一個(gè)字符判斷為空則為true
boolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));
可見,根據(jù)以上三種實(shí)現(xiàn)方式,可以在某種程度上優(yōu)化if里判斷條件過(guò)多的情況,那么,在哪種場(chǎng)景里比較合適利用其優(yōu)化呢?
在日常實(shí)際開發(fā)當(dāng)中,我們可能會(huì)看到過(guò)這樣存在很多判斷條件的代碼:
if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) ||
StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) ||
StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6)
){
.....
}
這時(shí),就可以考慮到,使用stream流來(lái)優(yōu)化,優(yōu)化后的代碼如下:
if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){
.....
}
這樣優(yōu)化后,是不是就比那堆if里堆積到一塊的條件更為優(yōu)雅了?
當(dāng)然,這只是針對(duì)或條件的,若是遇到與條件時(shí),同樣可以用Stream來(lái)優(yōu)化,例如:
if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2) &&
StringUtils.isEmpty(str3) && StringUtils.isEmpty(str4) &&
StringUtils.isEmpty(str5) && StringUtils.isEmpty(str6)
){
.....
}
使用Stream優(yōu)化后:
if(Stream.of(str1, str2, str3, str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){
.....
}
四、使用Map優(yōu)化if-else
優(yōu)化量比較多的面向過(guò)程的if-else語(yǔ)句,還可以考慮使用Map來(lái)優(yōu)化,雖然在一定程度上,創(chuàng)建一個(gè)額外map會(huì)占用內(nèi)存,但那丁點(diǎn)內(nèi)存對(duì)于現(xiàn)階段計(jì)算機(jī)而言,可以說(shuō)不足掛齒。下面使用一個(gè)案例來(lái)介紹下————
在一些祖?zhèn)骼洗a當(dāng)中,可能遇到過(guò)類似這樣又臭又冗余的if-else寫法:
public String getDay(String day){
if("Monday".equals(day)){
return "今天上英語(yǔ)課";
}else if("Tuesday".equals(day)){
return "今天上語(yǔ)文課";
}else if("Wednesday".equals(day)){
return "今天上數(shù)學(xué)課";
}else if("Thursday".equals(day)){
return "今天上音樂(lè)課";
}else if("Sunday".equals(day)){
return "今天上編程課";
}else{
......
}
}
這時(shí),可以根據(jù)具體場(chǎng)景,來(lái)考慮是否可以利用Map優(yōu)化,使用Map優(yōu)化的方式,是先在該類中定義一個(gè)static的map,類似這樣:
public static final Map<String,String> dayMap= ImmutableMap.<String, String>builder()
.put("Monday","今天上英語(yǔ)課")
.put("Tuesday","今天上語(yǔ)文課")
.put("Wednesday","今天上數(shù)學(xué)課")
.put("Thursday","今天上音樂(lè)課")
.put("Sunday","今天上編程課")
.build();
定義完后,就直接在先前使用if-else的方法里,進(jìn)行這樣優(yōu)化:
public String getDay(String day){
return dayMap.get(day);
}
這樣優(yōu)化后,業(yè)務(wù)方法里的判斷獲取值的處理,是不是就清爽了很多,當(dāng)然,這只是針對(duì)量比較多的if-else而言,若是比較少的判斷語(yǔ)句,再額外定義一個(gè)map來(lái)搞,隱約有畫蛇添足的嫌疑。
細(xì)心的讀者可能會(huì)發(fā)現(xiàn), 我在定義map的時(shí)候,使用到了一個(gè)ImmutableMap的東西,這是Google Guava里的一個(gè)類,可生成一個(gè)不可變的Map對(duì)象,這就意味著,初始化定義后,后續(xù)就無(wú)法再put修改了,它的這個(gè)特性可以保證線程的安全。一般用來(lái)替換if-else的map,我們就是要求在初始化定義后,就不會(huì)再允許修改了,因此,這個(gè)ImmutableMap生成的map,可以很好地幫我們實(shí)現(xiàn)這一點(diǎn)。另外,最重要一點(diǎn)是,使用這個(gè)ImmutableMap,可以實(shí)現(xiàn)鏈?zhǔn)骄幊?,就像上面定義的鏈?zhǔn)綄懛?,若是用傳統(tǒng)的map定義,就每次都要map.put()、map.put()地賦值。
關(guān)于ImmutableMap的原理,我專門寫一篇文章來(lái)介紹:《Java源碼分析:Guava之不可變集合ImmutableMap的源碼分析》
五、使用枚舉優(yōu)化if-else
前面提到過(guò)可使用策略枚舉來(lái)優(yōu)化大批量的if-else,當(dāng)然,若只是判斷獲不同條件來(lái)取值的代碼,可以考慮直接使用枚舉來(lái)優(yōu)化,其效果與map的處理效果類似。
還是用前面判斷課程的if-else為案例來(lái)優(yōu)化。
首先,先在類中定義一個(gè)枚舉:
public enum dayEnum {
Monday("今天上英語(yǔ)課"),
Tuesday("今天上語(yǔ)文課"),
Wednesday("今天上數(shù)學(xué)課"),
Thursday("今天上音樂(lè)課"),
Sunday("今天上編程課");
public String value;
dayEnum(String value){
this.value=value;
}
}
定義完后,就可以類似前面map的方式,直接將判斷值去枚舉里獲取,然后直接返回獲取到的值,這樣寫法是不是也比較優(yōu)雅了。
public String getDay(String day){
return dayEnum.valueOf(day).value;
}
六、使用Optional類優(yōu)化if-else
在實(shí)際工作中,我曾經(jīng)遇到類似這樣的代碼,看起來(lái)像沒(méi)什么問(wèn)題,但如果其中某個(gè)屬性值不幸為null,那么,恭喜你,你將會(huì)喜提一個(gè)NullPointerException異常。
String name=school.getGrades().getStuendt().getName();
若要處理這個(gè)可能出現(xiàn)的空指針異常,傳統(tǒng)寫法,可以寫一堆if-else語(yǔ)句來(lái)處理,就像這樣子——
String name=null;
if(school!=null){
Grades grade=school.getGrades();
if(grade!=null){
Student student=grade.getStuendt();
if(student!=null){
name = student.getName();
}
}
}
作為一個(gè)極度討厭if-else的人士,怎么能容忍這一堆層層嵌套的代碼存在呢!
在遇到這種層層嵌套的if-else判斷時(shí),可以考慮使用jdk1.8新特性O(shè)ptional 類來(lái)優(yōu)化,優(yōu)化后的效果如下,頓時(shí)又優(yōu)雅了很多。
String name = Optional.ofNullable(school) .flatMap(School::getGrades) .flatMap(Grades::getStuendt) .map(Student::getName) .orElse(null);
本文屬于if-else優(yōu)化編程技巧總結(jié),后續(xù)若在實(shí)踐中有新收獲,將持續(xù)更新......
到此這篇關(guān)于淺談Java編程技巧之if-else的優(yōu)化總結(jié)的文章就介紹到這了,更多相關(guān)Java if-else的優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
springboot項(xiàng)目啟動(dòng)自動(dòng)跳轉(zhuǎn)到瀏覽器的操作代碼
這篇文章主要介紹了springboot項(xiàng)目啟動(dòng)自動(dòng)跳轉(zhuǎn)到瀏覽器的操作代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
SpringBoot Actuator埋點(diǎn)和監(jiān)控及簡(jiǎn)單使用
最近做的項(xiàng)目涉及到埋點(diǎn)監(jiān)控、報(bào)表、日志分析的相關(guān)知識(shí),于是搗鼓的一番,下面把涉及的知識(shí)點(diǎn)及SpringBoot Actuator埋點(diǎn)和監(jiān)控的簡(jiǎn)單用法,給大家分享下,感興趣的朋友一起看看吧2021-11-11
javaweb前端向后端傳值的幾種方式總結(jié)(附代碼)
javaweb是java開發(fā)中的一個(gè)方向,下面這篇文章主要給大家介紹了關(guān)于javaweb前端向后端傳值的幾種方式的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
java后臺(tái)發(fā)起get請(qǐng)求獲取響應(yīng)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了java后臺(tái)發(fā)起get請(qǐng)求獲取響應(yīng)數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Eclipse2020安裝了最新版本的JDK卻無(wú)法打開的問(wèn)題
這篇文章主要介紹了Eclipse2020安裝了最新版本的JDK卻無(wú)法打開,提示版本太老的完美解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解
這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11
在Spring Boot中處理文件上傳功能實(shí)現(xiàn)
這篇文章主要介紹了如何在Spring Boot中處理文件上傳,通過(guò)配置文件上傳屬性、創(chuàng)建控制器來(lái)處理上傳的文件,并通過(guò)異常處理器來(lái)管理錯(cuò)誤情況,可以快速實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下2024-06-06

