Recursion Groovy::映射查找递归

Recursion Groovy::映射查找递归,recursion,groovy,map,find,Recursion,Groovy,Map,Find,编辑 有关映射递归的“正确”Groovy式方法,请参见下面的@tim解决方案。由于Map findRecursive在Groovy中尚不存在,如果您发现自己在应用程序的各个部分都需要此功能,只需将其添加到Map元类: Map.metaClass.findRecursive = {String key-> if(delegate.containsKey(key)) return delegate."$key" else for(m in delegate) {

编辑 有关映射递归的“正确”Groovy式方法,请参见下面的@tim解决方案。由于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-d深度之外的映射元素中递归,但事实似乎并非如此

滚动我自己的递归地图查找器,但我想知道是否有更好的方法来做到这一点。也许我缺少一个内置函数,或者一个更为简洁的方法来实现以下功能:

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') 
使用Groovy 1.8(findResult方法的reqd),您可以执行以下操作:

class DeepFinder {
  static Object findDeep( Map map, Object key ) {
    map.get( key ) ?: map.findResult { k, v -> if( v in Map ) v.findDeep( key ) }
  }
}

use( DeepFinder ) {
  println map.findDeep( 'team' )
}

据我所知,没有递归默认Groovy方法…

+1@tim,很好的替代解决方案。(地图)m.findRecursive('foo')将是对Groovy.lang的一个很好的补充,imo.@virtual,我同意。。。也许可以为DGM设计一个补丁,进行一些测试,然后提交给JIRA?可能会变成1.8.2right,可能会先在Groovy用户上发布,这可能是尚未实现的原因之一。同时,编辑了我的帖子,将递归查找器添加到Map元类中(来自可怕的LAMP stack,拥有蛋糕并吃掉它真是太神奇了;--)