57

特定のマップで特定のキーを見つけたい。キーが見つかったら、マップからそのキーの値を取得したいと思います。

これは私がこれまでに管理したものです:

def mymap = [name:"Gromit", likes:"cheese", id:1234]

def x = mymap.find{ it.key == "likes" }

if(x)
    println x.value

これは機能し、出力は期待どおり「チーズ」です。素晴らしいですがx.value、最後にはやりたくありませんif(x)。xに何らかの値を直接含めたい。

次のように値を x に直接取得することはできません。

def mymap = [name:"Gromit", likes:"cheese", id:1234]

def x = mymap.find{ it.key == "likesZZZ" }.value

println x

この場合、find クロージャは null であるため、Null Pointer Exception が発生します。もちろん、上記のコード スニペットは の場合it.key == "likes"に機能しますが、マップ内でターゲット キーが常に見つかるかどうかはわかりません。

マップ上でこれを行うための「グルービア」で安全な方法は何ですか:

  • マップに特定のキーがあるかどうかを確認し、
  • もしそうなら、このキーの値を取得します
4

5 に答える 5

71

マップを使用する最大のポイントは、直接アクセスできることです。マップの値が Groovy-falseにならないことが確実にわかっている場合は、次のようにできます。

def mymap = [name:"Gromit", likes:"cheese", id:1234]
def key = "likes"

if(mymap[key]) {
    println mymap[key]
}

ただし、値が Groovy-falseになる可能性がある場合は、次を使用する必要があります。

if(mymap.containsKey(key)) {
    println mymap[key]
}

ただし、値が Groovy- にならないことがわかっていてfalse(またはそれを無視できる)、デフォルト値が必要な場合の最も簡単な解決策は次のとおりです。

def value = mymap[key] ?: "default"

これらの 3 つのソリューションはすべて、キーのマップ全体をスキャンしないため、例よりも大幅に高速です。それらは、ダイレクトキーアクセスをほぼ瞬時にするHashMap(または) 設計を利用しています。LinkedHashMap

于 2013-01-07T15:51:49.837 に答える
30
def mymap = [name:"Gromit", id:1234]
def x = mymap.find{ it.key == "likes" }?.value
if(x)
    println "x value: ${x}"

println x.getClass().name

?.null をチェックし、Groovy で例外を作成しません。キーが存在しない場合、結果はorg.codehaus.groovy.runtime.NullObject.

于 2017-01-09T14:46:31.997 に答える