我有以下代码
#!/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)
}
答案 0 :(得分:2)
您的代码缺少闭包调用。值得一提的是,您创建的地图具有以下类型:
Map<String,Closure> map = generateStageMap(jobs)
您在示例末尾添加的代码没有任何作用。
map.each {
it.value
}
它仅“触摸”存储在映射中的值,但不调用其持有的闭包。获得预期输出的最简单方法是实际调用闭包。您可以通过调用call()
方法来实现:
map.each {
it.value.call()
}
或在表达式的末尾添加()
:
map.each {
it.value()
}
两者都会调用闭包并产生您期望的输出。