4

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

为什么这不起作用?

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

但以下行有效:

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

一个后续问题。为什么这行得通?我使用的是 StringUtils v 2.6,所以它没有 varargs 方法。groovy 是否总是将方法参数转换为数组?

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

这在很大程度上是一个好奇的问题。我不会使用 StringUtils,因为我昨天发布了一个单独的问题并找到了更好的解决方案。但是,我仍然想了解为什么技术 #1 不起作用,但 #3 确实有效。

4

1 回答 1

8

因此,为了显示正在发生的事情,让我们编写一个脚本并显示我们得到的输出:

@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[] 方法定义匹配。对于另外两个,Groovy 正在为您的方法调用选择最佳匹配。

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

因为3)这很好,因为你得到一个Object[]带有 3 个元素的元素,但对于1),你得到一个Object[]带有一个元素的元素;你的List.

使其与 List 参数一起使用的一种方法是使用扩展运算符,如下所示:

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

然后将打印:

4) onetwothree

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

于 2012-03-20T15:55:13.130 回答