2

たとえば、マップが次の値に等しい場合:

z = ['x':1, 'y':2]

f(2)の場合、次のようになります。

[x':2, 'y':4]

.eachループを使用して実行できることはわかっています。問題は、もっと簡単な方法があるかどうかです。

ありがとうございました

4

1 に答える 1

5

collectEntriesすべてのキーと値に適用され、更新された値で新しいMap値を返す関数があります。 Map

def z = [x:1, y:2]
z = z.collectEntries{ key, value -> [(key): value*2] }
assert z == [x:2, y:4]

ここにいくつかのメモ:

  • まず、マップリテラルで文字列キーを引用する必要はありません。意味['z':1]はと同じです[z:1]が、後者の方がよりグルーヴィーで読みやすくなっています。
  • 第二に、クロージャーの戻り値はcollectEntriesマップでなければならないので、そこで注意してください
  • 第3に、マップで動的キーを提供する場合は、それらを括弧で囲む必要があるため(key)、だけでなく、を使用する必要があります。key
  • 第4に、メソッドの結果を割り当てる必要があります。メソッドはインプレースで機能しません。

each()ただし、次のように、単一引数のクロージャーで使用する方がほぼ確実にクリーンです。

def z = [x:1, y:2]
z.each{ it.value = it.value*2 }
assert z == [x:2, y:4]

この方法では、落とし穴が少なくなり、マップがインプレースで変更されるため、変数を再割り当てする必要がありません。

于 2013-02-04T03:15:46.690 に答える