Grails搜索地图

时间:2013-06-21 21:53:50

标签: grails groovy

我是一名Java程序员,试图编写一些Groovy代码。

我想遍历名为loginAttributevalues的地图,并为每个密钥(例如用户名)找到交叉引用属性值并打印出来:

john:display_name

但是,我无法使用Groovy语法获取Java大脑。有人能指出我正确的方向吗?感谢。

loginAttributeValues = [username: 'john', email: 'john@smith.com']

def mapXref = [username: 'display_name',
               firstname: 'first_name',
               lastname: 'last_name',
               email: 'email'}



for (String x : loginAttributeValues) {
    if (mapXref[x])
        println(mapXref.get(x))
}

2 个答案:

答案 0 :(得分:1)

这应该适合你:

loginAttributeValues.each {
    if (mapXref[it])
        println(mapXref.get(it))
}

Java for:每个语法在groovy中无效。您最好使用each关闭。

或者,如果您真的想保留for循环语法,请将in替换为:

答案 1 :(得分:0)

loginAttributeValues = [username: 'john', email: 'john@smith.com']

def mapXref = [username: 'display_name',
               firstname: 'first_name',
               lastname: 'last_name',
               email: 'email']


def newMap = [:]
loginAttributeValues.each {k, v ->
     newMap << (k in mapXref.keySet() ? [(v): mapXref[k]] : [:])
}

assert newMap.'john' == 'display_name'
assert newMap.'john@smith.com' == 'email'

我希望你需要一张像

这样的地图

[john:display_name, john@smith.com:email]

但为什么您需要将john作为key而将display_name作为value。不应该是另外的。在这种情况下,您需要

newMap << (k in mapXref.keySet() ? [mapXref[k] : v] : [:])

将断言为

assert newMap.display_name == 'john'
assert newMap.email == 'john@smith.com'

注意: -
如果保证loginAttributeValues keys中的keys子集mapXref,则逻辑可以优化如下

def newMap = loginAttributeValues.collectEntries{k, v ->
    [v, mapXref[k]]
}