之前我用 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技術堆疊微信公眾號,堆疊長將繼續分享好玩的 Java 技術,公眾號第一時間推送,關注公眾號還可以在選單中獲取歷史 Java 教程,都是干貨,
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,重繪你的認知!!
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187612.html
標籤:Java
上一篇:【C/C++】虛擬機實作:用C語言來寫Java虛擬機
下一篇:Java基礎語法:運算子
