deepak
deepak

Reputation: 49

changing map values in groovy doesn't work

I am using Groovy version 2.1.0. I am trying to read values from a map and update another map.

a = ["key1":"" ,"key2":""]
b = ["key1": "10", "key3":"99" ]
for (i in b){
 if( i.key in a)
   a.(i.key) = i.value
}
def key2 = "key2"
a.key2 = "value2"
println a.get("key2")
println "value returned is :" + a.get("key1") + ":"

This results in o/p

value2 value returned is ::

But if the map 'a' doesn't contain empty string as values, then it works fine as expected.

a = ["key1":"7" ,"key2":""]
b = ["key1": "10", "key3":"99" ]
for (i in b){
 if( i.key in a)
   a.(i.key) = i.value
}
a."key2" = "value2"
println a.get("key2")
println "value returned is :" + a.get("key1") + ":"

This results in o/p

value2 value returned is :10:

I want to update the empty map with values, like in the first scenario. Where am I getting it wrong.

Thanks in advance.

Upvotes: 0

Views: 1183

Answers (2)

tim_yates
tim_yates

Reputation: 171184

As Opal says, it's the if that's causing difficulties...

if( i.key in a)

Will fail if the key is not in the map, OR the value equates to Groovy False

You could do:

a = ["key1":"" ,"key2":""]
b = ["key1": "10", "key3":"99" ]

a = (a+b).findAll { k, v -> k in a.keySet() }

def key2 = "key2"
a[ key2 ] = "value2"

println a.key2
println "value returned is : $a.key1 :"

(be careful, your key2 bit wasn't doing what I believe you expected (it worked as your key2 var name was the same as its value)

Upvotes: 2

Opal
Opal

Reputation: 84864

You need to change:

if( i.key in a)
   a.(i.key) = i.value

To:

if( i.key in a.keySet())
   a.(i.key) = i.value

Upvotes: 2

Related Questions