Редактировать См. Ниже решение @ tim для «правильного» Groovy-esque подхода к рекурсии карты.Поскольку Map findRecursive еще не существует в Groovy, если вам нужна эта функциональность в различных частях вашего приложения, просто добавьте ее в метакласс Map:
Map.metaClass.findRecursive = {String key->
if(delegate.containsKey(key)) return delegate."$key"
else
for(m in delegate) {
if(m.value in Map) return m.value.findRecursive(key)
}
}
// then anywhere in your app
someMap.findRecursive('foo')
Original как findResult {it.key == 'foo'} будет проходить через элементы карты за пределами глубины 1-го, но, похоже, это не так.
Прокрутил мой собственный рекурсивный искатель карт, но мне интересно, есть лилучший способ сделать это.Может быть, мне не хватает встроенной функции или хотя бы Groovier (краткий) способ выполнить следующее:
Map map = [school:[id:'schoolID', table:'_school',
children:[team:[id:'teamID',table:'_team',
children:[player:[id:'playerID',table:'_roster']]
]]
]]
class Foo {
static finder = {Map map, String key->
if(map.containsKey(key)) return map[key]
else
for(m in map) {
if(m.value in Map) return this.finder(m.value,key)
}
}
}
println Foo.finder(map,'team')