0

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

我想遍历名为 loginAttributevalues 的映射,并为每个键(例如用户名)找到交叉引用属性值并打印:

约翰:显示名称

但是,我无法让我的 Java 大脑了解 Groovy 语法。有人可以指出我正确的方向吗?谢谢。

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))
}
4

2 回答 2

1

这应该适合你:

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

Java for : 每种语法在 groovy 中都无效。你最好使用each闭包。

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

于 2013-06-21T22:02:53.690 回答
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作为 akeydisplay_nameas value。不应该是这样。在这种情况下,您需要

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

这将断言为

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

注意:-
如果保证loginAttributeValues将具有inkeys的子集,则可以按如下方式优化逻辑keysmapXref

def newMap = loginAttributeValues.collectEntries{k, v ->
    [v, mapXref[k]]
}
于 2013-06-21T22:25:08.297 回答