if else 太多?看我用 Java 8 輕鬆幹掉!
阿新 • • 發佈:2020-10-23
之前我用 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`,同事直呼看不懂,沒看過的可以點選[這裡](https://mp.weixin.qq.com/s/UYBLw17wVL6baBpjFRkySQ)進行閱讀。
最近又來了個奇怪的需求,大概的邏輯是這樣的,有一個引數,如果該值為空,就依次取幾個備用引數的值,如果幾個備用的引數都為空,最後取預設值。
> 如:取 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