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

之前我用 Java 8 寫了一段邏輯,就是類似下面這樣的例子:

<code>/*
* 來源:Java技術棧 
*/
if(xxxOrder != null){
    if(xxxOrder.getXxxShippingInfo() != null){
        if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
            if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
                ...
            }
        }
    }
}/<code>

要逐個判空再取最後的不為空的值,這樣寫,如果 if 多了就極不優雅,於是,我利用了 Java 8 的 Optional.map 方法幹掉了層層 if,同事直呼看不懂,沒看過的關注Java技術棧閱讀。

最近又來了個奇怪的需求,大概的邏輯是這樣的,有一個參數,如果該值為空,就依次取幾個備用參數的值,如果幾個備用的參數都為空,最後取默認值。

如:取 info 的值,如果 info 為空,就依次取 info1, info2, info3, info4 的值,如果都為空,就取系統默認值。

感覺就是和上次的場景完全相反,上次是依次判斷不為空取最後的值,這個是取第一個不為空的值。

實現方案1

用 if/else 來實現:

<code>/*
* 來源: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技術棧(默認)";
                }
            }
        }
    }
}/<code>

我敢打賭,肯定會有人會這麼寫,這樣寫很不優雅,如果備用值有很多個,那不是要瘋了。。

實現方案2

當然,還有這樣的寫法:

<code>/*
* 來源: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技術棧";
}/<code>

這個寫法要比第一個要好點,也是用的比較多的寫法。

實現方案3(推薦)

上面那個也是層層 if 還有 else if,也不是很優雅,在很多書中也不推薦這麼寫,而推薦這麼寫:

<code>/*
* 來源: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技術棧";
}/<code>

這樣寫稍微聰明點,也是推薦的寫法,單獨抽取一個方法,依次返回,這樣可以避免過多的 if/else 而導致潛在的邏輯混亂的可能。

實現方案4(終極推薦)

即使這樣,感覺代碼還是不是很好看,if 判斷太多了,下面看棧長我如何用 Java 8 幹掉這些 if/else 吧!

Java 8 方案示例:

<code>/*
* 來源:Java技術棧 
*/
List list = new ArrayList<>(Arrays.asList(info, info1, info2, info3, info4, "Java技術棧(默認)"));
list.removeIf(StringUtils::isBlank);
String result = list.get(0);/<code>

3行搞定,爽!!!

是怎樣實現的呢?我們逐行展開分析下:

  • 依次用每個參數構建一個List
  • 移除所有為空的參數
  • 找出第一個不為空的參數

利用 Java 8 新增的 removeIf 方法巧妙的幹掉了 if/else,並且可以使用 Lambda 表達式或者方法引用,是不是很優雅呢?

本來想利用 Stream 一行搞定的,無奈 Stream 不能接收 null 參數,不然報指針異常。

關於這段 if/else 邏輯你還知道別的改進方式嗎?歡迎留言分享!

本次的分享就到這裡了,希望對大家有用。覺得不錯,在看、轉發分享一下哦~

點擊下面的瞭解更多鏈接關注Java技術棧,乾貨第一時間推送。


分享到:


相關文章: