правильно, может сначала опубликовать это на Groovy, может быть причиной того, что это еще не реализовано. Тем временем отредактировал мой пост, чтобы добавить рекурсивный искатель к метаклассу Map (исходя из ужасного стека LAMP, поистине удивительно иметь свой торт и есть его; -))

тировать Посмотрите решение @ 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')

оригинал Была надежда, что что-то вроде 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') 

Ответы на вопрос(1)

Ваш ответ на вопрос