1. 程式人生 > >if else 太多?看我用 Java 8 輕鬆幹掉!

if else 太多?看我用 Java 8 輕鬆幹掉!

之前我用 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