以前我用 Java 8 寫了一段邏輯,就是相似下面這樣的例子:java
/* * 來源公衆號: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
,同事直呼看不懂,沒看過的能夠點擊這裏進行閱讀。spring
最近又來了個奇怪的需求,大概的邏輯是這樣的,有一個參數,若是該值爲空,就依次取幾個備用參數的值,若是幾個備用的參數都爲空,最後取默認值。微信
如:取 info 的值,若是 info 爲空,就依次取 info1, info2, info3, info4 的值,若是都爲空,就取系統默認值。
感受就是和上次的場景徹底相反,上次是依次判斷不爲空取最後的值,這個是取第一個不爲空的值。intellij-idea
用 if/else
來實現:ide
/* * 來源公衆號: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技術棧(默認)"; } } } } }
我敢打賭,確定會有人會這麼寫,這樣寫很不優雅,若是備用值有不少個,那不是要瘋了。。spring-boot
固然,還有這樣的寫法:性能
/* * 來源公衆號: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技術棧"; }
這個寫法要比第一個要好點,也是用的比較多的寫法。idea
上面那個也是層層 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
而致使潛在的邏輯混亂的可能。code
即便這樣,感受代碼仍是不是很好看,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行搞定,爽!!!
是怎樣實現的呢?咱們逐行展開分析下:
利用 Java 8 新增的 removeIf
方法巧妙的幹掉了 if/else
,而且可使用 Lambda
表達式或者方法引用,是否是很優雅呢?
原本想利用 Stream
一行搞定的,無奈 Stream
不能接收 null
參數,否則報指針異常。
關於這段 if/else
邏輯你還知作別的改進方式嗎?歡迎留言分享!
本次的分享就到這裏了,但願對你們有用。以爲不錯,在看、轉發分享一下哦~
關注Java技術棧微信公衆號,棧長將繼續分享好玩的 Java 技術,公衆號第一時間推送,關注公衆號還能夠在菜單中獲取歷史 Java 教程,都是乾貨。
近期熱文推薦:
1.Java 15 正式發佈, 14 個新特性,刷新你的認知!!
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。
以爲不錯,別忘了隨手點贊+轉發哦!