Цикл по карте в Groovy?

175

У меня очень простая задача, которую я пытаюсь выполнить в 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

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

Kevin
источник
Как вы видели в ответах, проблема в том, что итерация по карте дает вам набор «записей», вы предполагали, что это даст вам ключи, и вы будете искать значения. Если вы хотите сделать это таким образом, выполните итерации по map.keySet (), а остальное будет работать так, как вы ожидали.
Билл К
Это должно работать, если вы используете s.key& s.valueв вашем коде внутри цикла.
Inblueswithu

Ответы:

328

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

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

map.each{ k, v -> println "${k}:${v}" }
разъем
источник
2
Из любопытства, где это задокументировано в документации на языке Groovy ( я так не думаю! )? Я думаю, мне интересно, с точки зрения новичков Groovy, как вы узнали это?
Смееб
10
@smeeb: все хорошо задокументировано, посмотрите здесь: groovy-lang.org/groovy-dev-kit.html#_iterating_on_maps
Джек,
101

В качестве альтернативы вы можете использовать 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).

ubiquibacon
источник
Я использую GGTS 3.2 и регулярно устанавливаю точки останова в замыканиях (включая «каждое» замыкания). Проблема в том, чтобы использовать F6, чтобы пройти через замыкание, так как оно пройдет через все это. Технически, вы можете нажать F5 несколько раз и в конечном итоге оказаться там, но точка останова быстрее.
Филип
Обновленный ответ. Я использую NetBeans, и его отладка Groovy / Grails находится в подпункте.
Ubiquibacon
4
Плюс вы можете разорвать для цикла, а не в .each.
Александр Сурафель
1
@AlexanderSuraphel Вы правы, что вы не можете использовать breakдля выхода each, но вы можете использоватьreturn
Ubiquibacon
7
@ubiquibacon нет, ты не можешь. returnаналогично continueнет break.
Александр Сурафель
20

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

sbglasius
источник
5
Спасибо за объяснение, почему код OP не работает
dj18
15

Другой вариант:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}
Пабло Пасос
источник