在列表上使用 inject() 建立 CSV 字串

在 Groovy 中,inject() 方法是允許我們向實現 inject() 方法的任何物件新增(或注入)新功能的累積方法之一。對於 Collection,我們可以統一對一組物件應用閉包,然後將結果整理為單個值。inject() 方法的第一個引數是累積的初始值,第二個引數是閉包。

在此示例中,我們將字串列表作為引數,並輸出由逗號分隔的字串的值。我已經使用此功能將值列表附加到 REST 查詢字串,如果稍微修改它,我已經使用它將值包含到 SQL 語句中作為 IN 子句的一部分。這是執行此操作的程式碼:

public String convertToCSV( List<String> list ) {
    if (list == null) {
        return ""
    }
    return list.inject( '' ) { result, item ->
        result + ( result && item ? ',' : '' ) + ( item ? "${item.trim()}" : '' )
    }
}

assert convertToCSV( null ) == ""
assert convertToCSV( ["aaa", "bbb  ", null, "  ccc  "] ) == "aaa,bbb,ccc" 

在此示例中,inject() 方法的第一個引數是零長度字串,這意味著在處理列表的第一個元素時,結果也是零長度字串。這在第一個三元評估中解析為 false,這就是我們在字串開頭沒有逗號的原因。每次連續迭代遍歷列表的元素,結果將成為自身的連線,逗號,然後是下一個專案,直到我們到達列表中的最後一項。

這種方法的優點是你不需要迴圈結構之外的變數來儲存連線的 String 結果。這意味著這可能會導致程式碼中出現副作用。使用 inject() 方法,會注入此行為,並且集合會為你調整對閉包的呼叫結果。這種方法的缺點是可讀性。但是通過一些經驗,它變得更容易閱讀和理解,我希望這個例子可以幫助你實現這一目標。