Johan
Johan

Reputation: 40628

Return multiple values from map in Groovy?

Let's say I have a map like this:

def map = [name: 'mrhaki', country: 'The Netherlands', blog: true, languages: ['Groovy', 'Java']]

Now I can return "submap" with only "name" and "blog" like this:

def keys = ['name', 'blog']
map.subMap(keys)
// Will return a map with entries name=mrhaki and blog=true

But is there a way to easily return multiple values instead of a list of entries?

Update:

I'd like to do something like this (which doesn't work):

def values = map.{'name','blog'}

which would yield for example values = ['mrhaki', true] (a list or tuple or some other datastructure).

Upvotes: 0

Views: 6560

Answers (3)

dsharew
dsharew

Reputation: 10675

map.subMap(keys)*.value

The Spread Operator (*.) is used to invoke an action on all items of an aggregate object. It is equivalent to calling the action on each item and collecting the result into a list

Upvotes: 6

Matias Bjarland
Matias Bjarland

Reputation: 4482

For completeness I'll add another way of accomplishing this using Map.findResults:

map.findResults { k, v -> k in keys ? v : null }

flexible, but more long-winded than some of the previous answers.

Upvotes: 1

glenn jackman
glenn jackman

Reputation: 247220

You can iterate over the submap and collect the values:

def values = map.subMap(keys).collect {it.value}
// Result: [mrhaki, true]

Or, iterate over the list of keys, returning the map value for that key:

def values = keys.collect {map[it]}

I would guess the latter is more efficient, not having to create the submap.

A more long-winded way to iterate over the map

def values = map.inject([]) {values, key, value -> 
    if (keys.contains(key)) {values << value}
    values
}

Upvotes: 4

Related Questions