Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Groovy调用Java Apache StringUtils.join()_Java_String_Groovy_Apache Stringutils_String Utils - Fatal编程技术网

从Groovy调用Java Apache StringUtils.join()

从Groovy调用Java Apache StringUtils.join(),java,string,groovy,apache-stringutils,string-utils,Java,String,Groovy,Apache Stringutils,String Utils,我试图从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 后续问题。为什么这样做有效?我使用的是StringUti

我试图从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 v2.6,因此它没有varargs方法。groovy是否总是将方法参数转换为数组

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

这在很大程度上是一个好奇的问题。我不打算使用StringUtils,因为我发布了一篇文章并找到了一个更好的解决方案。然而,我仍然想理解为什么技术1不起作用,而技术3起作用。

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

@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)
,因为它与
对象[]
匹配。对于另外两个,Groovy正在为您的方法调用挑选能够找到的最佳匹配项

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

对于
3)
这很好,因为您得到一个包含3个元素的
对象[]
,但是对于
1)
,您得到一个包含一个元素的
对象[]
;您的
列表

让它与List参数一起工作的一种方法是使用如下类似的方法:

然后打印:

4) onetwothree

正如预期的那样(它会将列表中的所有元素作为单独的参数放入,然后将它们放入一个包含三个元素的
对象[]
,如示例
3所示)

对于#1,结果是数组的字符串表示,而不是将数组的实际元素连接在一起。在将数组发送到join()方法之前,它似乎已转换为字符串。这个答案是惊人的。我希望我能提供多张选票。描述清晰透彻。另外,你提到了spread操作符。谢谢蒂姆·耶茨。
4) onetwothree