【问题标题】:How to execute closure as value of a Groovy map?如何执行闭包作为 Groovy 映射的值?
【发布时间】:2019-01-10 19:33:15
【问题描述】:

我有以下代码

#!/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)
}

【问题讨论】:

  • 顺便说一句,您的闭包不会返回任何值,而是会产生副作用(写入标准输出)。是有意的吗?
  • 是的,这只是测试代码。您的建议有效,我接受了它作为答案。

标签: groovy


【解决方案1】:

您的代码缺少闭包调用。首先值得一提的是,您创建的地图属于以下类型:

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

您放在示例末尾的代码什么也不做。

map.each {
    it.value
}

它只“触及”存储在映射中的值,但不会调用它持有的闭包。获得预期输出的最简单方法是实际调用闭包。您可以通过调用call() 方法来做到这一点:

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

或者只是在表达式末尾添加()

map.each {
    it.value()
}

两者都会调用闭包并产生您期望的输出。

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多