我试图从Groovy类中调用Apache Commons StringUtils.join()方法。我想连接3个字符串(part1
,part2
和part3
)。
为什么这不起作用?
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,因为我发布了separate question yesterday并找到了更好的解决方案。但是,我仍然想知道为什么技术#1不起作用,但#3确实有效。
答案 0 :(得分: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)
,这很好,因为你得到一个包含3个元素的Object[]
,但对于1)
,你得到一个带有一个元素的Object[]
;你的List
。
使用List参数使用它的一种方法是使用spread operator,如下所示:
path = StringUtils.join( *[ part1, part2, part3 ] )
println "4) $path"
然后打印:
4) onetwothree
正如预期的那样(它会将列表中的所有元素作为单独的参数放入,然后将这些元素放入带有三个元素的Object[]
中,如示例3)