Groovy 2.x中加入字符串集合的Grooviest方法

时间:2014-11-22 02:30:44

标签: string join groovy

我刚试过:

List<String> values = getSomehow()
values.join(",")

但是看到join从2.1开始已被弃用。所以我问:我应该如何根据最新的首选/不弃用语法编写它?

另外,有没有办法用闭包来实现这个目的?我觉得我可以在这里使用collect()或类似的东西。

4 个答案:

答案 0 :(得分:16)

您可以在Iterator中使用join方法的DefaultGroovyMethods变体。它的签名是相同的,只需要传入分隔符。

看起来像这样:

List<String> values = ["string1", "string2", "string3"]
String joinedValues = values.join(",")

或者您可以在一行中完成所有操作:

String joinedValues = ["string1", "string2", "string3"].join(",")

答案 1 :(得分:4)

您需要使用Iterable的{​​{1}}或Iterator<Object>版本:

join(Iterator<Object> self, String separator)

而不是

join(Collection self, String separator)

这是唯一不推荐使用的join种类。

joinjoin(Iterable self, String separator)正在使用中。

答案 2 :(得分:4)

如果您担心弃用问题,当前版本的Groovy JDK(http://groovy-lang.org/gdk.html)会在join(String)Iterable中显示Object[]方法,和Iterator,其中没有一个被弃用。

由于所有集合都实现了Iterable,因此您的原始语法很好。

如果你真的想使用闭包,那么

List strings = ['this', 'is', 'a', 'list']
String result = strings.inject { acc, val ->
    "$acc,$val"
}
assert result == 'this,is,a,list'

有效,但它肯定不仅仅是strings.join(',')

答案 3 :(得分:1)

正如我在文档中看到的那样,join在集合中已弃用,但在Iterable中不被弃用。

def joinedValues = (values as Iterable).join ', '

使用闭包,您可以尝试使用.injectheadtail来编写闭包:

values.head() + (values.size() > 1 ? values.tail().inject( '' ) { acc, i -> acc+', ' + i } : '')