2012-03-20 87 views
3

我试图从Groovy类中调用Apache Commons的StringUtils.join()方法。我想连接3个字符串(part1,part2part3)。从Groovy调用Java Apache StringUtils.join()

为什么不能正常工作?

def path = StringUtils.join([part1, part2, part3]) //1 

但是下面一行的工作原理:

def path = StringUtils.join([part1, part2, part3] as String[]) //2 

一个跟进的问题。为什么这个工作?我使用的是StringUtils v 2.6,所以它没有可变参数方法。 groovy是否总是将方法参数转换为数组?

def path = StringUtils.join(part1, part2, part3) //3 

这在很大程度上是一个好奇的问题。我不打算使用StringUtils,因为我发布了separate question yesterday并找到了更好的解决方案。但是,我仍然想知道为什么技术#1不起作用,但#3确实起作用。

+0

对于#1,th e结果是数组的字符串表示形式,而不是将数组的实际元素连接在一起。它显示数组在发送到join()方法之前转换为String。 – Ryan 2012-03-20 15:54:14

回答

7

因此,显示发生了什么,让我们写一个剧本,并显示输出什么,我们得到:

@Grab('commons-lang:commons-lang:2.6') 
import org.apache.commons.lang.StringUtils 

def (part1,part2,part3) = [ 'one', 'two', 'three' ] 

def path = StringUtils.join([ part1, part2, part3 ]) 
println "1) $path" 

path = StringUtils.join([ part1, part2, part3 ] as String[]) 
println "2) $path" 

path = StringUtils.join(part1, part2, part3) 
println "3) $path" 

此打印:

1) [one, two, three] 
2) onetwothree 
3) onetwothree 

基本上,你的方法只有一个调用匹配StringUtils类中的签名是2),因为它匹配Object[]method definition。对于另外两个,Groovy正在挑选可以为您的方法调用找到的最佳匹配。

对于1)3),它都做同样的事情。包装参数为Object[]并调用相同的方法2)

对于3),这是好的,因为你会得到一个Object[]有3个要素,但对于1),你会得到一个Object[]一个元素;您的List

得到它与List参数工作方式,是使用spread operator像这样:

path = StringUtils.join(*[ part1, part2, part3 ]) 
println "4) $path" 

这将然后打印:

4) onetwothree 

正如预期的那样(这将令列表中的所有元素作为单独的参数,然后这些元素将被放入具有三个元素的Object[]中,如示例3)

+0

这个答案是惊人的。我希望我可以提供多个upvotes。描述清晰彻底。另外,你提到了扩散算子。谢谢tim_yates。 – Ryan 2012-03-20 17:04:43