微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Groovy ::地图查找递归

如何解决Groovy ::地图查找递归

|| 编辑 有关映射递归的“正确” Groovy风格的方法,请参见下面的@tim解决方案。由于Groovy中还不存在Map findRecursive,因此如果您发现自己在应用的各个部分都需要此功能,只需将其添加到Map MetaClass中即可:
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的地图元素,但事实并非如此。 滚动了我自己的递归地图查找器,但想知道是否有更好的方法可以做到这一点。也许我缺少一个内置函数,或者甚至没有一种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\') 
    

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。