Как выполнить замыкание как значение Groovy-карты? - PullRequest
0 голосов
/ 10 января 2019

У меня есть следующий код

#!/usr/local/homebrew/bin/groovy

def jobs = ['Groovy', 'Rocks', 'Big', 'Time']

def generateStage(String service, Integer sleepTime=0) {
    return {
          sleep sleepTime
          println "Hello $service"
    }
}

Map generateStageMap(List list) {
    Integer sleepTime = 0
    Map stageMap = [:]
    list.each {
        stageMap[it] = generateStage(it, sleepTime)
        // slightly staggered starts so we don't have too many
        // request per sec to the CLI
        sleepTime += 5
    }
    return stageMap
}

Map map = generateStageMap(jobs)
map.each {
  it.value
}

Как заставить его выполнить оператор println, чтобы вывод выглядел следующим образом?

Hello Groovy
Hello Rocks
Hello Big
Hello Time

Или еще лучше, как я могу проверить, что сгенерированное замыкание содержит ключ. Например, в псевдокоде

map.each {
  // just sample code that conveys the idea
  assert it.value.contains(it.key)
}

1 Ответ

0 голосов
/ 10 января 2019

В вашем коде отсутствует закрывающий вызов. Первое, на что стоит обратить внимание: карта, которую вы создаете, имеет следующий тип:

Map<String,Closure> map = generateStageMap(jobs)

Код, который вы поместили в конце вашего примера, ничего не делает.

map.each {
    it.value
}

Он только «касается» значения, хранящегося на карте, но не вызывает закрытие, которое он удерживает. Самый простой способ получить ожидаемый результат - вызвать закрытие. Вы можете сделать это, вызвав метод call():

map.each {
    it.value.call()
}

или просто добавив () в конец выражения:

map.each {
    it.value()
}

Оба вызовут замыкания и произведут ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...