2012-03-20 85 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