Пропустить карту через Groovy?

У меня очень простая задача, которую я пытаюсь сделать в Groovy, но не могу заставить ее работать. Я просто пытаюсь пропустить объект карты в Groovy и распечатать ключ и значение, но этот код не работает.

// A simple map
def map = [
        iPhone : 'iWebOS',
        Android: '2.3.3',
        Nokia  : 'Symbian',
        Windows: 'WM8'
]

// Print the values
for (s in map) {
    println s + ": " + map[s]
}

Я пытаюсь заставить вывод выглядеть так:

iPhone: iWebOS
Android: 2.3.3
Nokia: Symbian
Windows: WM8

Может кто-нибудь прокомментировать, как это сделать?

Ответ 1

Довольно просто с закрытием:

def map = [
           'iPhone':'iWebOS',
           'Android':'2.3.3',
           'Nokia':'Symbian',
           'Windows':'WM8'
           ]

map.each{ k, v -> println "${k}:${v}" }

Ответ 2

В качестве альтернативы вы можете использовать цикл for, как показано в Groovy Docs:

def map = ['a':1, 'b':2, 'c':3]
for ( e in map ) {
    print "key = ${e.key}, value = ${e.value}"
}

/*
Result:
key = a, value = 1
key = b, value = 2
key = c, value = 3
*/

Одним из преимуществ использования цикла for в отличие от закрытия each является упрощенная отладка, так как вы не можете попасть в точку прерывания внутри закрытия each (при использовании Netbeans).

Ответ 3

При использовании цикла for значение s является элементом Map.Entry, что означает, что вы можете получить ключ из s.key и значение из s.value

Ответ 4

Другая опция:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}