2012-03-20 7 views
3

Groovyクラス内でApache Commons StringUtils.join()メソッドを呼び出そうとしています。私は3つの文字列(part1part2、およびpart3)を連結したいと思います。GroovyからJava Apache StringUtils.join()を呼び出す

なぜこれは機能しませんか?

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

しかし、次の行は動作します:

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

A質問をフォローアップ。なぜこれは機能しますか?私はStringUtils v 2.6を使用しているので、varargsメソッドはありません。 groovyはメソッドのパラメータを常に配列に変換しますか?

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

これは主に好奇心の質問です。私はseparate question yesterdayを投稿してより良い解決策を見つけたので、StringUtilsを使用するつもりはありません。しかし、テクニック#1がうまくいかず、#3がうまくいく理由を理解したいと思います。

+0

第1位結果は配列の文字列表現であり、配列の実際の要素は連結されていません。 join()メソッドに送られる前に配列がStringに変換されているようです。 – Ryan

答えて

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クラスのシグネチャと一致するのは、 method definitionと一致するため、2)です。他の2つについては、Groovyがメソッド呼び出しのために見つけることのできる最良のマッチを選んでいます。

1)3)については、同じことをしています。 Object[]ようにパラメータをラッピングし、3)について2)

と同じメソッドを呼び出して、あなたがObject[] 3を持つ要素を取得し、これは、罰金ですが、1)のために、あなたは一つの要素でObject[]を取得します。あなたのList

それはリストのパラメータで動作するように取得する方法、そのようspread operatorを使用することです:

その後、プリントう
path = StringUtils.join(*[ part1, part2, part3 ]) 
println "4) $path" 

4) onetwothree 

予想したように(それは置きますリストのすべての要素を別々のパラメータとして組み込み、次に例のように3つの要素を持つObject[]に入れます。3)

+0

この回答は驚異的です。私は複数のアップフォートを提供できることを願っています。説明はきれいで徹底的です。加えて、普及した演算子について言及しました。ありがとうございますtim_yates。 – Ryan