我是一名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))
}
答案 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]]
}