2013-06-21 80 views
0

我是一名嘗試編寫Groovy代碼的Java程序員。Grails搜索地圖

我想通過地圖叫loginAttributevalues迭代,併爲每個鍵(如用戶名)找到交叉引用屬性值並打印此:

約翰:DISPLAY_NAME

不過,我有麻煩讓我的Java大腦圍繞Groovy語法。有人能指引我朝着正確的方向嗎?謝謝。

loginAttributeValues = [username: 'john', email: '[email protected]'] 

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
loginAttributeValues = [username: 'john', email: '[email protected]'] 

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.'[email protected]' == 'email' 

我希望你需要像那樣的地圖

[john:display_name, [email protected]:email]

但爲什麼你需要爲keydisplay_namevaluejohn。否則它不應該。在這種情況下,你需要

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

這將宣稱爲

assert newMap.display_name == 'john' 
assert newMap.email == '[email protected]' 

注: -
如果保證loginAttributeValues將有keyskeys子集mapXref,那麼邏輯可以優化如下

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

這應該爲你工作:

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

的Java進行:每個語法是無效的常規。您最好使用each閉包。或者,如果您確實想要保留for循環語法,請用in代替: