簡體   English   中英

如何執行閉包作為Groovy映射的值?

[英]How to execute closure as value of a Groovy map?

我有以下代碼

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

您的代碼缺少閉包調用。 值得一提的是,您創建的地圖具有以下類型:

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

您放在示例末尾的代碼什么都不做。

map.each {
    it.value
}

它只“觸及”存儲在地圖中的值,但它不會調用它所擁有的閉包。 獲得預期輸出的最簡單方法是實際調用閉包。 你可以通過調用call()方法來做到這一點:

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

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

map.each {
    it.value()
}

兩者都會調用閉包並產生您期望的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM