2016-08-19 2 views
1

Javaの文字列、たとえばVS:Groovyの文字列私は私が他の文字列から作ることGroovyで文字列を持っている

def final PREFIX = "myprefix" 
def prefix2 = PREFIX + ".whatever1" 

私はHashMapを持っていると私はキーの一部としてprefix2を使用して検索を行いたいとし:

HashMap<String,String> map = new HashMap<String,String>() 
map.put("myprefix.whatever1.value","aaa") 

私が行う場合:次に

def key = "${prefix2}.value" 
String result=(map.get(key)) 

result = nullしかし、私がすれば:

String key="${prefix2}.value" 
String result=(map.get(key)) 

次にresult = aaaです。

私はこれがなぜ起こるのか、明らかに型推論の問題を理解することができます。しかし、私はまだそれが気分が悪いと感じる。何かがちょうどそれについて "感じる"ことはありません。分かりますか?

このタイプのものは正常であり、「期待する」必要がありますか? Groovyが引用符を使用して文字列を作成した場合、Stringオブジェクト参照として定義されていないHashmap <String, String>の値を検索するときに使用する必要があることをGroovyが知りたいのですか?これはバグか機能ですか?

+2

文字列に補間が使用されている場合、これはGStringです。それはちょうどそれが動作する方法です。それはバグでも機能でもありません。 http://stackoverflow.com/a/7591157/438992 –

+0

https://issues.apache.org/jira/browse/GROOVY-885を見てください - 基本的には "修正されません" –

+0

またhttp:// stackoverflow .com/questions/19030483/groovystring-hashcode-and-equals-do-not-evaluate-to-same-value-as-string –

答えて

2

これがなぜ起こっているかを考慮する必要があることはいくつかあります。

変数HashMap<String,String> mapを作成すると、javaのように、キーと値として文字列を追加できるだけであることが予想されます。これは、次のように動作すること考慮されません型引数としてグルーヴィーではそうではありません:あなたが述べたようにも

HashMap<String,String> map = new HashMap<String,String>() 
map.put(1, 2) 
assert map.get(1) == 2 
assert map.get(1) instance of Integer 

"${prefix2}.value"などの補間文字列はGStringのインスタンス(GStringImplがためにあります具体的な)ので、次ので

def key = "${prefix2}.value" 
assert key instanceof GString 

真である文字列の制約がドロップされているので、map.get(key)GStringImplが同じを与える場合は問題ではないであろう、エラーなしGStringパラメータで呼び出されます地図上の取得がnull

を返す理由Stringとしてハッシュコードが、それはこれがあなたがtoString()またはGストリングを割り当てるのいずれかを使用して述べたようにこの問題を回避する方法は、あるではありません

​​3210

ん(toString()は暗黙に呼び出されます)

私が好むもう一つの方法は、通常のJavaスタイルのマップアクセスをGroovyのものに混ぜないことです。GStringを使用してマップ上で索引付けされたプロパティ表記法またはキーを使用すると、完全に機能します。

def final PREFIX = "myprefix" 
def prefix2 = PREFIX + ".whatever1" 

// def map = [:] // shorter will be a LinkedHashMap 
HashMap<String,String> map = [:] as HashMap // if you really need HashMap 
map."myprefix.whatever1.value" = "aaa" 

def key = "${prefix2}.value" 

assert map[key] == "aaa" 
assert map."${prefix2}.value" == "aaa" 
assert map."$key" == "aaa" 
+0

ああ、面白い、グルーヴィーなコンパイラプロセスのプロパティ表記が、gstringとしてマップ上にあります( 'map。" myprefix.whatever1.value "= ...')?だから 'map。 'を使うと、$ {prefix2} .value" 'の代わりにうまくいくでしょうか? (あなたは 'マップをハードコードする必要はありません。myprefix.whatever1.value" ')私は明日それを試してみます – sloven

0

GStringのtoString()メソッド(groovyの補間された文字列)を呼び出すことができます。これはjava.lang.Stringを返します。このような文字列を使用してHashMapなどの値を取得する場合は、

def prefix = "some.string" 
map.get("${prefix}.value".toString()) 
関連する問題