Groovy拼接Map值结果不一致原因及Jenkins环境下正确实现方案
问题解答
1. Jenkins中运行报错的原因
报错核心是Jenkins Pipeline执行环境对Groovy代码做了CPS(连续传递风格)变换,和标准Groovy运行时的闭包返回值处理逻辑存在差异:
- 标准Groovy运行时中,闭包最后一行表达式的结果会作为闭包返回值,你代码里
result += e.value执行后会返回修改后的List,所以inject方法可以正常累积值,最终返回完整的List调用join()就能得到预期结果。 - 但在Jenkins的CPS变换逻辑中,当
+=这类赋值操作作为闭包最后一行语句时,返回值会被处理为null。这就导致inject每轮迭代的闭包都返回null,累积值无法正常传递,最终inject的返回结果为null,调用join()方法就触发空指针异常。该问题和你使用的Groovy 2.4.12版本本身无关,是Jenkins Pipeline运行时的特殊逻辑导致的。
2. 符合Groovy惯用写法的实现方案
最简洁的原生实现直接调用Map的values()方法获取所有值,再调用join()拼接即可,无需额外遍历操作:
def d = ["foo":"lorem", "bar":"ipsum", "baz":"dolor"] def j = d.values().join()
如果确实有场景需要用inject实现(比如累积过程中需要增加额外处理逻辑),只要在闭包末尾显式返回累积变量就能兼容Jenkins环境:
def j = d.inject([]) { result, e -> result += e.value return result }.join()
另一种等价的collect写法逻辑更直观,也兼容Jenkins环境:
def j = d.collect { it.value }.join()
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

