从Groovy调用Java Apache StringUtils.join()

Rya*_*yan 3 java string groovy string-utils apache-stringutils

我试图从Groovy类中调用Apache Commons StringUtils.join()方法.我想连接3串(part1,part2,和part3).

为什么这不起作用?

def path = StringUtils.join([part1, part2, part3]) //1
Run Code Online (Sandbox Code Playgroud)

但以下行有效:

def path = StringUtils.join([part1, part2, part3] as String[]) //2
Run Code Online (Sandbox Code Playgroud)

跟进问题.为什么这样做?我使用的是StringUtils v 2.6,因此它没有varargs方法.groovy总是将方法参数转换为数组吗?

def path = StringUtils.join(part1, part2, part3)  //3
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tes 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"
Run Code Online (Sandbox Code Playgroud)

这打印:

1) [one, two, three]
2) onetwothree
3) onetwothree
Run Code Online (Sandbox Code Playgroud)

基本上,与StringUtils类中的签名匹配的唯一一个方法调用是2),因为它与Object[] 方法定义匹配.对于另外两个,Groovy正在选择可以为您的方法调用找到的最佳匹配.

对于这两个1)3),它做同样的事情.将参数包装为Object[]和调用相同的方法2)

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

让它与List参数一起使用的一种方法是使用spread运算符,如下所示:

path = StringUtils.join( *[ part1, part2, part3 ] )
println "4) $path"
Run Code Online (Sandbox Code Playgroud)

然后将打印:

4) onetwothree
Run Code Online (Sandbox Code Playgroud)

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