Janeth Fernando
Janeth Fernando

Reputation: 104

Groovy iterate over Map of maps

I have a groovy map which looks like below.

image_map = [:]
image_map = [obj_1: ['1','2'], obj_2: ['3','4']]

I want to iterate through all the values(for obj_1, iterate throuth the list values['1','2']) for each object and run a method from the object.

obj_1.method(1)
obj_1.method(2)
obj_2.method(3)
obj_2.method(4)

Upvotes: 1

Views: 2347

Answers (1)

tim_yates
tim_yates

Reputation: 171154

Depends why you want to do it, but you could grab the values and flatten them:

image_map.values().flatten().each {
    println it
}

So with the added requirement in the comment, you could do:

image_map.collectMany { k, v -> v.collect { "${k}.method($it)" } }
    .each { println it }

To print

obj_1.method(1)
obj_1.method(2)
obj_2.method(3)
obj_2.method(4)

Edit 2 with another requirement... Assuming the keys ARE the objects (and not strings):

def obj_1 = [method: { it -> "I am obj1 $it" }]
def obj_2 = [method: { it -> "I am obj2 $it" }]

image_map = [(obj_1): ['1','2'], (obj_2): ['3','4']]

image_map.collectMany { k, v -> v.collect { [object: k, param: it] } }
    .each { println it.object.method(it.param) }

Prints:

I am obj1 1
I am obj1 2
I am obj2 3
I am obj2 4

Upvotes: 5

Related Questions