通篇if-else,看得太煩怎麼辦,看Java8如何化腐朽為神奇
之前我用 Java 8 寫了一段邏輯,就是類似下面這樣的例子:
/*
* 來源公眾號:Java技術棧
*/
if(xxxOrder != null){
if(xxxOrder.getXxxShippingInfo() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
...
}
}
}
}
要逐個判空再取最後的不為空的值,這樣寫,如果 if
多了就極不優雅,於是,我利用了 Java 8 的 Optional.map
方法幹掉了層層 if
,同事直呼看不懂,沒看過的可以點選這裡進行閱讀。
最近又來了個奇怪的需求,大概的邏輯是這樣的,有一個引數,如果該值為空,就依次取幾個備用引數的值,如果幾個備用的引數都為空,最後取預設值。
如:取 info 的值,如果 info 為空,就依次取 info1, info2, info3, info4 的值,如果都為空,就取系統預設值。
感覺就是和上次的場景完全相反,上次是依次判斷不為空取最後的值,這個是取第一個不為空的值。
實現方案1
用 if/else
來實現:
/*
* 來源公眾號:Java技術棧
*/
String info = xx.getInfo();
if (info == null) {
info = xx.getInfo1();
if (info == null) {
info = xx.getInfo2();
if (info == null) {
info = xx.getInfo3();
if (info == null) {
info = xx.getInfo4();
if (info == null) {
info = "Java技術棧(預設)";
}
}
}
}
}
我敢打賭,肯定會有人會這麼寫,這樣寫很不優雅,如果備用值有很多個,那不是要瘋了。。
實現方案2
當然,還有這樣的寫法:
/*
* 來源公眾號:Java技術棧
*/
String info = null;
if (xx.getInfo() != null) {
info = xx.getInfo();
} else if (xx.getInfo1() != null) {
info = xx.getInfo1();
} else if (xx.getInfo2() != null) {
info = xx.getInfo2();
} else if (xx.getInfo3() != null) {
info = xx.getInfo3();
} else if (xx.getInfo4() != null) {
info = xx.getInfo4();
} else {
info = "Java技術棧";
}
這個寫法要比第一個要好點,也是用的比較多的寫法。
實現方案3(推薦)
上面那個也是層層 if
還有 else if
,也不是很優雅,在很多書中也不推薦這麼寫,而推薦這麼寫:
/*
* 來源公眾號:Java技術棧
*/
public String getInfo(XX xx)
if (xx.getInfo() != null) {
return xx.getInfo();
}
if (xx.getInfo1() != null) {
return xx.getInfo1();
}
if (xx.getInfo2() != null) {
return xx.getInfo2();
}
if (xx.getInfo3() != null) {
return xx.getInfo3();
}
if (xx.getInfo4() != null) {
return xx.getInfo4;
}
return "Java技術棧";
}
這樣寫稍微聰明點,也是推薦的寫法,單獨抽取一個方法,依次返回,這樣可以避免過多的 if/else
而導致潛在的邏輯混亂的可能。
實現方案4(終極推薦)
即使這樣,感覺程式碼還是不是很好看,if
判斷太多了,下面看棧長我如何用 Java 8 幹掉這些 if/else
吧!
Java 8 方案示例:
/*
* 來源公眾號:Java技術棧
*/
List<String> list = new ArrayList<>(Arrays.asList(info, info1, info2, info3, info4, "Java技術棧(預設)"));
list.removeIf(StringUtils::isBlank);
String result = list.get(0);
3行搞定,爽!!!
是怎樣實現的呢?我們逐行展開分析下:
- 依次用每個引數構建一個List
- 移除所有為空的引數
- 找出第一個不為空的引數
利用 Java 8 新增的 removeIf
方法巧妙的幹掉了 if/else
,並且可以使用 Lambda
表示式或者方法引用,是不是很優雅呢?
本來想利用 Stream
一行搞定的,無奈 Stream
不能接收 null
引數,不然報指標異常。
關於這段 if/else
邏輯你還知道別的改進方式嗎?歡迎留言分享!
關注公眾號:Java架構師聯盟,每日更新技術好文
相關文章
- mac太燙怎麼辦?Mac
- 化腐朽為神奇!揭開ISP影像處理的神秘面紗,基於瑞芯微RK3568J工業平臺!
- windows10系統太刺眼怎麼辦_windows10螢幕太刺眼怎麼調Windows
- win10看圖慢怎麼辦 win10看圖太卡怎麼解決Win10
- 「Java8系列」神奇的函式式介面Java函式
- 你在為什麼煩惱著
- win10沒有wifi只有乙太網該怎麼辦Win10WiFi
- 基礎-vuex真是太麻煩了Vue
- win10移動熱點未建立乙太網怎麼辦_win10移動熱點如何建立乙太網Win10
- win10 乙太網屬性 空白怎麼解決_win10乙太網屬性開啟是空白怎麼辦Win10
- Mac開不了機怎麼辦?彆著急看這裡Mac
- win10 字型醜怎麼辦_win10字型難看如何變好看Win10
- iOS12降級無法將備份恢復到此iphone因為軟體太舊怎麼辦?iOSiPhone
- if-else if-else 的用法
- 精益的價值是什麼?如何讓企業發生看得見的變化
- 自建資料庫太麻煩?華為雲資料庫GaussDB既省心又省力資料庫
- 影片素材太多怎麼辦?看Mac使用者如何使用NAS解決儲存難題Mac
- win10自帶看圖工具找不到了怎麼辦?Win10
- 在Linux中,記憶體怎麼看?磁碟狀態怎麼看?Linux記憶體
- 併發的核心:CAS 是什麼?Java8是如何優化 CAS 的?Java優化
- 第14講 | HTTP協議:看個新聞原來這麼麻煩HTTP協議
- WIN10看優酷老卡屏怎麼辦 WIN10系統看優酷影片總是卡屏如何修復Win10
- excel太長了怎麼截圖 excel如何滾動截長圖Excel
- win10啟動太慢如何優化_window10啟動慢怎麼辦Win10優化
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- 降雨雲圖怎麼看?
- win10副檔名太長怎麼辦_win10檔名太長無法刪除的解決方法Win10
- 拼多多沒有流量怎麼辦?如何處理?
- WIN10看優酷老卡屏怎麼辦 WIN10系統看優酷視訊總是卡屏如何修復Win10
- 【數字化】數字化轉型是什麼、為什麼、怎麼辦;2018年數字化供應鏈行業及案例分析報告行業
- 結婚難因為想太多?來看報告怎麼說!
- 怎麼看筆記本硬體?想買筆記本不知如何看硬體筆記
- 古馳高仿包包怎麼樣gucci高仿包看得出嗎
- 西方人覺得中國電商太神奇:歐美企業可以學什麼VT
- if-else程式碼優化的八種方案優化
- win10啟動太慢如何最佳化_window10啟動慢怎麼辦Win10
- excel求和始終等於零怎麼辦 自動求和為零怎麼處理Excel
- Java程式設計細節-重構-為什麼 if-else 不是好程式碼Java程式設計