I am trying to get a list from a map and based on id's list and want to retrieve the values (list) based on age (age > 35)
def people = [
"1": [[name:'Bob', age: 32, gender: 'M'],[name:'Johnny', age: 36, gender: 'M']],
"3": [[name:'Claire', age: 21, gender: 'F'],[name:'Amy', age: 54, gender:'F']],
"4": [[name:'John', age: 41, gender: 'F'],[name:'Sam', age: 54, gender:'F']]
]
def id = ["1","3"]
def age = people.subMap(id).values().findAll{it.age > 35}
However, i am getting the below error:
Cannot compare java.util.ArrayList with value '[32, 36]' and java.lang.Integer with value '35'
How can I get the list of all persons whose age is > 35?
You need to .flatten() the result of people.subMap(id).values(), because it produces a list of list of maps:
[[[name:Bob, age:32, gender:M], [name:Johnny, age:36, gender:M]], [[name:Claire, age:21, gender:F], [name:Amy, age:54, gender:F]]]
When you do people.subMap(id).values().flatten() you will get a list of maps:
[[name:Bob, age:32, gender:M], [name:Johnny, age:36, gender:M], [name:Claire, age:21, gender:F], [name:Amy, age:54, gender:F]]
And then you can apply .findAll { it.age > 35 }
def people = [
        "1": [[name: 'Bob', age: 32, gender: 'M'], [name: 'Johnny', age: 36, gender: 'M']],
        "3": [[name: 'Claire', age: 21, gender: 'F'], [name: 'Amy', age: 54, gender: 'F']],
        "4": [[name: 'John', age: 41, gender: 'F'], [name: 'Sam', age: 54, gender: 'F']]
]
def id = ["1", "3"]
def age = people.subMap(id).values().flatten().findAll { it.age > 35 }
println age
Output:
[[name:Johnny, age:36, gender:M], [name:Amy, age:54, gender:F]]
Hope it helps.
Though not as Groovy as the other answer, a simple approach is to collect via a transform function, and return [] for a non-match (which can be flattened out).
That is, given this:
def people = [
"1": [[name:'Bob', age: 32, gender: 'M'],[name:'Johnny', age: 36, gender: 'M']],
"3": [[name:'Claire', age: 21, gender: 'F'],[name:'Amy', age: 54, gender:'F']],
"4": [[name:'John', age: 41, gender: 'F'],[name:'Sam', age: 54, gender:'F']]
]
def targetIds = ["1","3"]
def targetAge = 35
then:
def findAgeOverN = { def key, def list, def ids, def n ->
    (ids.contains(key)) ? list.findAll { it["age"] > n } : []
}
def result = people.collect { key, list -> findAgeOverN(key, list, targetIds, targetAge) }
                   .flatten()
assert [[name:'Johnny', age: 36, gender: 'M'], 
        [name:'Amy', age: 54, gender: 'F']]
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With