亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

淺談Java編程之if-else的優(yōu)化技巧總結(jié)

瀏覽:65日期:2022-08-10 09:07:32
一、使用策略枚舉來優(yōu)化if-else

看到網(wǎng)上蠻多人推薦使用策略模式來優(yōu)化if-else,但我總覺得,搞一堆策略類來優(yōu)化大批量if-else,雖然想法很好,但無意之中很可能又會(huì)創(chuàng)造出很多類對(duì)象,就顯得過于繁重了。若想使用策略模式來優(yōu)化大批量if-else,其實(shí)有一種更好的方式,這是策略模式+枚舉方式的改良,我以前寫過這樣一篇優(yōu)化文章,詳細(xì)直接點(diǎn)擊該文了解《策略枚舉:消除在項(xiàng)目里大批量使用if-else的優(yōu)雅姿勢(shì)》

二、使用三目運(yùn)算符來優(yōu)化if-else

1、根據(jù)if-else條件來判斷賦值的,如:

String id='';if(flag){ id='a';}else{ id='b';}

利用三目運(yùn)算符,可以直接優(yōu)化成一行代碼:

id=flag?'a':'b';

2、利用if-else條件來判斷調(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中判斷條件過多情況

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è)字符串判斷不為空則為trueboolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s));//所有字符串判斷都不為空則為trueboolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s));//沒有一個(gè)字符判斷為空則為trueboolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));

可見,根據(jù)以上三種實(shí)現(xiàn)方式,可以在某種程度上優(yōu)化if里判斷條件過多的情況,那么,在哪種場(chǎng)景里比較合適利用其優(yōu)化呢?

在日常實(shí)際開發(fā)當(dāng)中,我們可能會(huì)看到過這樣存在很多判斷條件的代碼:

if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) || StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) || StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6) ){ .....}

這時(shí),就可以考慮到,使用stream流來優(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來優(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)化量比較多的面向過程的if-else語句,還可以考慮使用Map來優(yōu)化,雖然在一定程度上,創(chuàng)建一個(gè)額外map會(huì)占用內(nèi)存,但那丁點(diǎn)內(nèi)存對(duì)于現(xiàn)階段計(jì)算機(jī)而言,可以說不足掛齒。下面使用一個(gè)案例來介紹下————

在一些祖?zhèn)骼洗a當(dāng)中,可能遇到過類似這樣又臭又冗余的if-else寫法:

public String getDay(String day){ if('Monday'.equals(day)){ return '今天上英語課'; }else if('Tuesday'.equals(day)){ return '今天上語文課'; }else if('Wednesday'.equals(day)){ return '今天上數(shù)學(xué)課'; }else if('Thursday'.equals(day)){ return '今天上音樂課'; }else if('Sunday'.equals(day)){ return '今天上編程課'; }else{ ...... }}

這時(shí),可以根據(jù)具體場(chǎng)景,來考慮是否可以利用Map優(yōu)化,使用Map優(yōu)化的方式,是先在該類中定義一個(gè)static的map,類似這樣:

public static final Map<String,String> dayMap= ImmutableMap.<String, String>builder() .put('Monday','今天上英語課') .put('Tuesday','今天上語文課') .put('Wednesday','今天上數(shù)學(xué)課') .put('Thursday','今天上音樂課') .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而言,若是比較少的判斷語句,再額外定義一個(gè)map來搞,隱約有畫蛇添足的嫌疑。

細(xì)心的讀者可能會(huì)發(fā)現(xiàn), 我在定義map的時(shí)候,使用到了一個(gè)ImmutableMap的東西,這是Google Guava里的一個(gè)類,可生成一個(gè)不可變的Map對(duì)象,這就意味著,初始化定義后,后續(xù)就無法再put修改了,它的這個(gè)特性可以保證線程的安全。一般用來替換if-else的map,我們就是要求在初始化定義后,就不會(huì)再允許修改了,因此,這個(gè)ImmutableMap生成的map,可以很好地幫我們實(shí)現(xiàn)這一點(diǎn)。另外,最重要一點(diǎn)是,使用這個(gè)ImmutableMap,可以實(shí)現(xiàn)鏈?zhǔn)骄幊蹋拖裆厦娑x的鏈?zhǔn)綄懛ǎ羰怯脗鹘y(tǒng)的map定義,就每次都要map.put()、map.put()地賦值。

關(guān)于ImmutableMap的原理,我專門寫一篇文章來介紹:《Java源碼分析:Guava之不可變集合ImmutableMap的源碼分析》

五、使用枚舉優(yōu)化if-else

前面提到過可使用策略枚舉來優(yōu)化大批量的if-else,當(dāng)然,若只是判斷獲不同條件來取值的代碼,可以考慮直接使用枚舉來優(yōu)化,其效果與map的處理效果類似。

還是用前面判斷課程的if-else為案例來優(yōu)化。

首先,先在類中定義一個(gè)枚舉:

public enum dayEnum { Monday('今天上英語課'), Tuesday('今天上語文課'), Wednesday('今天上數(shù)學(xué)課'), Thursday('今天上音樂課'), 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)遇到類似這樣的代碼,看起來像沒什么問題,但如果其中某個(gè)屬性值不幸為null,那么,恭喜你,你將會(huì)喜提一個(gè)NullPointerException異常。

String name=school.getGrades().getStuendt().getName();

若要處理這個(gè)可能出現(xiàn)的空指針異常,傳統(tǒng)寫法,可以寫一堆if-else語句來處理,就像這樣子——

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 類來優(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 真实国产乱子伦精品一区二区三区 | 亚洲国产欧美日韩 | 国产精品免费视频一区 | 视色4se成人午夜精品 | 国产午夜在线观看视频 | 99色在线视频 | 国产精品久久久久久久久福利 | 国产午夜免费一区二区三区 | 欧美国产一区二区二区 | 国产v亚洲v欧美v专区 | 最新国产麻豆精品 | 久久精品国产久精国产80cm | 91黑丝国产线观看免费 | 欧美三区在线观看 | 日韩国产免费一区二区三区 | 免费黄色在线观看 | 香蕉看片 | 国产露脸对白刺激3p在线 | 69日影院 | 国产乱子伦一区二区三区 | 国产欧美日韩视频怡春院 | 久久一本日韩精品中文字幕屁孩 | 国产中文字幕第一页 | 91精品手机国产免费 | 在线观看日韩一区 | 国产簧片| 日韩欧美精品一区二区 | 日本一视频一区视频二区 | 韩国黄色一级视频 | 无码日韩精品一区二区免费 | 亚欧精品一区二区三区 | 曰本一级毛片免费播放 | 久久成人影视 | 中文字幕 视频一区 | 天天拍夜夜操 | 成人 在线欧美亚洲 | 在线碰| 337p日本大胆| 精品国产一区二区三区www | 亚洲精品在线免费观看视频 | 爽妇综合网|