我刚试过:
List<String> values = getSomehow()
values.join(",")
但是看到join
从2.1开始已被弃用。所以我问:我应该如何根据最新的首选/不弃用语法编写它?
另外,有没有办法用闭包来实现这个目的?我觉得我可以在这里使用collect()
或类似的东西。
答案 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
种类。
join
和join(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 ', '
使用闭包,您可以尝试使用.inject
,head
和tail
来编写闭包:
values.head() + (values.size() > 1 ? values.tail().inject( '' ) { acc, i -> acc+', ' + i } : '')