You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:15:00