在列表上使用 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() 方法,会注入此行为,并且集合会为你调整对闭包的调用结果。这种方法的缺点是可读性。但是通过一些经验,它变得更容易阅读和理解,我希望这个例子可以帮助你实现这一目标。