最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年06月23日 09:37:57   作者:朱季謙  
說實話,其實我很討厭在代碼里大量使用if-else,一是因為該類代碼執(zhí)行方式屬于面向過程的,二嘛,則是會顯得代碼過于冗余.這篇筆記,主要記錄一些自己在工作實踐當中針對if-else的優(yōu)化心得,將會不定期地長期更新,需要的朋友可以參考下

一、使用策略枚舉來優(yōu)化if-else

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

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

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

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

利用三目運算符,可以直接優(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ōu)化成:

Set<String> set1=new HashSet<>();
Set<String> set2=new HashSet<>();
(flag?set1:set2).add(id);

三、使用Stream優(yōu)化if中判斷條件過多情況

Jdk1.8新特性Stream流有三個這樣API,anyMatch,allMatch,noneMatch,各自的作用如下:

  • anyMatch:判斷條件里任意一個滿足條件,則返回true;
  • allMatch:判斷條件里所有都滿足條件,則返回true;
  • noneMatch:判斷條件里所有都不滿足條件,則返回true;

它們的使用方式其實很簡單:

List<String> list = Arrays.asList("a", "b", "c","d", "");
//任意一個字符串判斷不為空則為true
boolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s));
//所有字符串判斷都不為空則為true
boolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s));
//沒有一個字符判斷為空則為true
boolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));

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

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

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

這時,就可以考慮到,使用stream流來優(yōu)化,優(yōu)化后的代碼如下:

if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){
 .....
 }

這樣優(yōu)化后,是不是就比那堆if里堆積到一塊的條件更為優(yōu)雅了?

當然,這只是針對或條件的,若是遇到與條件時,同樣可以用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)建一個額外map會占用內(nèi)存,但那丁點內(nèi)存對于現(xiàn)階段計算機而言,可以說不足掛齒。下面使用一個案例來介紹下————

在一些祖?zhèn)骼洗a當中,可能遇到過類似這樣又臭又冗余的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{
       ......
    }
}

這時,可以根據(jù)具體場景,來考慮是否可以利用Map優(yōu)化,使用Map優(yōu)化的方式,是先在該類中定義一個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的方法里,進行這樣優(yōu)化:

public String getDay(String day){
    return dayMap.get(day);
}

這樣優(yōu)化后,業(yè)務(wù)方法里的判斷獲取值的處理,是不是就清爽了很多,當然,這只是針對量比較多的if-else而言,若是比較少的判斷語句,再額外定義一個map來搞,隱約有畫蛇添足的嫌疑。

細心的讀者可能會發(fā)現(xiàn), 我在定義map的時候,使用到了一個ImmutableMap的東西,這是Google Guava里的一個類,可生成一個不可變的Map對象,這就意味著,初始化定義后,后續(xù)就無法再put修改了,它的這個特性可以保證線程的安全。一般用來替換if-else的map,我們就是要求在初始化定義后,就不會再允許修改了,因此,這個ImmutableMap生成的map,可以很好地幫我們實現(xiàn)這一點。另外,最重要一點是,使用這個ImmutableMap,可以實現(xiàn)鏈式編程,就像上面定義的鏈式寫法,若是用傳統(tǒng)的map定義,就每次都要map.put()、map.put()地賦值。

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

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

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

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

首先,先在類中定義一個枚舉:

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

在實際工作中,我曾經(jīng)遇到類似這樣的代碼,看起來像沒什么問題,但如果其中某個屬性值不幸為null,那么,恭喜你,你將會喜提一個NullPointerException異常。

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

若要處理這個可能出現(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();
        }
    }
}

作為一個極度討厭if-else的人士,怎么能容忍這一堆層層嵌套的代碼存在呢!

在遇到這種層層嵌套的if-else判斷時,可以考慮使用jdk1.8新特性O(shè)ptional 類來優(yōu)化,優(yōu)化后的效果如下,頓時又優(yōu)雅了很多。

String name = Optional.ofNullable(school)
  .flatMap(School::getGrades)
  .flatMap(Grades::getStuendt)
  .map(Student::getName)
  .orElse(null);

本文屬于if-else優(yōu)化編程技巧總結(jié),后續(xù)若在實踐中有新收獲,將持續(xù)更新......

到此這篇關(guān)于淺談Java編程技巧之if-else的優(yōu)化總結(jié)的文章就介紹到這了,更多相關(guān)Java if-else的優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jasypt SaltGenerator接口定義方法源碼解讀

    jasypt SaltGenerator接口定義方法源碼解讀

    這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • springboot項目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼

    springboot項目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼

    這篇文章主要介紹了springboot項目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼,本文圖文實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • SpringBoot Actuator埋點和監(jiān)控及簡單使用

    SpringBoot Actuator埋點和監(jiān)控及簡單使用

    最近做的項目涉及到埋點監(jiān)控、報表、日志分析的相關(guān)知識,于是搗鼓的一番,下面把涉及的知識點及SpringBoot Actuator埋點和監(jiān)控的簡單用法,給大家分享下,感興趣的朋友一起看看吧
    2021-11-11
  • Java中單例模式的七種寫法示例

    Java中單例模式的七種寫法示例

    作為一個Java開發(fā)者,也許你覺得自己對單例模式的了解已經(jīng)足夠多了,但究竟你自己了解的程度到底怎樣呢?下面這篇文章主要給大家介紹了關(guān)于Java中單例模式的七種寫法,需要的朋友可以參考下
    2021-09-09
  • javaweb前端向后端傳值的幾種方式總結(jié)(附代碼)

    javaweb前端向后端傳值的幾種方式總結(jié)(附代碼)

    javaweb是java開發(fā)中的一個方向,下面這篇文章主要給大家介紹了關(guān)于javaweb前端向后端傳值的幾種方式的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • java后臺發(fā)起get請求獲取響應(yīng)數(shù)據(jù)

    java后臺發(fā)起get請求獲取響應(yīng)數(shù)據(jù)

    這篇文章主要為大家詳細介紹了java后臺發(fā)起get請求獲取響應(yīng)數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Eclipse2020安裝了最新版本的JDK卻無法打開的問題

    Eclipse2020安裝了最新版本的JDK卻無法打開的問題

    這篇文章主要介紹了Eclipse2020安裝了最新版本的JDK卻無法打開,提示版本太老的完美解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的路徑查找算法詳解

    這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)中圖的路徑查找算法,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-11-11
  • 在Spring Boot中處理文件上傳功能實現(xiàn)

    在Spring Boot中處理文件上傳功能實現(xiàn)

    這篇文章主要介紹了如何在Spring Boot中處理文件上傳,通過配置文件上傳屬性、創(chuàng)建控制器來處理上傳的文件,并通過異常處理器來管理錯誤情況,可以快速實現(xiàn)文件上傳功能,需要的朋友可以參考下
    2024-06-06
  • java 排序算法之快速排序

    java 排序算法之快速排序

    這篇文章主要介紹了java 排序算法之快速排序,文中通過圖片和代碼講解相關(guān)知識非常詳細,大家如果有需要的話可以參考一下這篇文章
    2021-09-09

最新評論

吴忠市| 福贡县| 日土县| 夏津县| 油尖旺区| 抚州市| 潜江市| 礼泉县| 晋州市| 丘北县| 八宿县| 东丽区| 南皮县| 邛崃市| 绍兴县| 方城县| 揭东县| 依安县| 九龙城区| 温宿县| 从化市| 陆丰市| 彰化市| 特克斯县| 龙南县| 富蕴县| 佛山市| 扎兰屯市| 旺苍县| 嘉荫县| 桦川县| 石首市| 石门县| 阳东县| 会宁县| 如皋市| 广元市| 富川| 定安县| 曲水县| 长阳|