groovy语法教程 collectEntries
def parallelStageMap = paralel_dolist.collectEntries{
["${it}"] : generateStage(it)]
}
这里用了"${it}",我看有的用了(it),啥区别这里
在 Groovy 的 collectEntries 方法中,"${it}" 和 (it) 有本质区别,它们分别用于不同的场景:
结果:无论 it 是什么类型,键都会变成字符串
示例:
groovy
def list = [1, 2, 3]
def map = list.collectEntries { ["${it}": it*10] }
// 结果:["1":10, "2":20, "3":30] (键是字符串类型)
2. (it)(动态键语法)
groovy
[(it): generateStage(it)]
作用:直接使用 it 的原始值作为键
结果:键保持 it 的原始类型(可能是数字/对象等)
示例:
groovy
def list = [1, 2, 3]
def map = list.collectEntries { [(it): it*10] }
// 结果:[1:10, 2:20, 3:30] (键是整数类型)
✅ 在您的代码中的选择建议
groovy
// 方案1:需要字符串键时(如作为JSON字段名)
["${it}": generateStage(it)]
// 方案2:需要保留原始类型时
[(it): generateStage(it)]
⚠️ 重要注意事项
默认行为陷阱:
如果直接写 [it: value],Groovy 会将其解析为字面量字符串键 "it"(而不是变量值):
groovy
[it: generateStage(it)] // 错误!实际得到 ["it": ...]
推荐做法:
大多数情况下,当键需要动态生成时:
优先使用 (it)(性能更好,避免不必要字符串转换)
仅在需要字符串键时使用 "${it}"
完整示例对比
groovy
def list = ["a", 1, true]
// 使用 ${it}(全转字符串键)
def map1 = list.collectEntries { ["${it}": "value"] }
// 结果:["a":"value", "1":"value", "true":"value"]
// 使用 (it)(保留原始类型键)
def map2 = list.collectEntries { [(it): "value"] }
// 结果:["a":"value", 1:"value", true:"value"]
根据您的需求选择合适语法即可。在 Jenkins Pipeline 的 parallel 阶段定义中,通常推荐使用字符串键("${it}"),因为阶段名必须是字符串。