当前位置: 首页 > 面试题库 >

无法在Jenkins Pipeline中使用Groovy在地图上进行迭代

邹桐
2023-03-14
问题内容

我们正在尝试迭代Map,但没有成功。我们将问题简化为以下最小示例:

def map = [
           'monday': 'mon',
           'tuesday': 'tue',
           ]

如果我们尝试迭代:

map.each{ k, v -> println "${k}:${v}" }

仅输出第一个条目: monday:mon

我们所知道的替代方法甚至无法进入循环:

for (e in map)
{
    println "key = ${e.key}, value = ${e.value}"
}

要么

for (Map.Entry<String, String> e: map.entrySet())
{
    println "key = ${e.key}, value = ${e.value}"
}

都失败了,都只显示异常java.io.NotSerializableException: java.util.LinkedHashMap$Entry。(这可能与在引发“真实”异常时发生的异常有关,使我们无法知道发生了什么)。

我们正在使用最新稳定的jenkins(2.19.1),并将所有插件更新为今天(2016/10/20)。

是否有解决方案来迭代MapJenkins管道Groovy脚本中的元素?


问题答案:

自从我玩这个游戏已经有一段时间了,但是迭代地图(和其他容器)的最佳方法是使用“经典” for循环或“ for
in”。请参见错误:二进制方法接受闭包的错误处理

对于您的特定问题,大多数(全部?)管道DSL命令将添加一个序列点,这意味着它可以保存管道的状态并在以后恢复它。例如,考虑等待用户输入,您甚至希望通过重新启动来保持此状态。结果是每个活动实例都必须序列化-
但是不幸的是,标准Map迭代器无法序列化。原始线程

我能想到的最好的解决方案是定义一个将Map转换为可序列化MapEntries列表的Function。该函数不使用任何流水线步骤,因此其中的任何内容都无需序列化。

@NonCPS
def mapToList(depmap) {
    def dlist = []
    for (def entry2 in depmap) {
        dlist.add(new java.util.AbstractMap.SimpleImmutableEntry(entry2.key, entry2.value))
    }
    dlist
}

显然,对于要迭代的每个映射都必须调用此函数,但是从另一方面来说,循环的主体保持不变。

for (def e in mapToList(map))
{
    println "key = ${e.key}, value = ${e.value}"
}

您将不得不SimpleImmutableEntry第一次批准构造函数,或者很可能可以通过将mapToList函数放置在工作流库中来解决该问题。



 类似资料:
  • 问题内容: 我有一个(实际上,我使用的是更复杂的POJO,但是为了我的问题而简化了它) 好像 : 我如何遍历此地图,打印出密钥,然后打印人名,然后打印人年龄,例如: A是Map < String ,Person> 的键 B是Person.getName()的名称 C是Person.getAge()的年龄 我可以使用.values()从地图中提取所有值,如HashMap文档中所述,但是我不确定如何获

  • 问题内容: 假设我正在遍历Java中的Map …我不清楚在遍历该Map的过程中我可以做什么。我猜我在Javadoc中对于Iterator接口remove方法的警告大多感到困惑: […]如果在迭代进行过程中以其他方式(而不是通过调用此方法)修改了基础集合,则未指定迭代器的行为。 我知道我可以毫无问题地调用remove方法。但是,在遍历Map集合时,我可以: 使用Map类put方法更改与键关联的值(使

  • 我是一个胡子新手,我想知道如何在这个地图上反复使用胡子 地图键名称各不相同。理想情况下,我希望mustache可以迭代其键和值。因此,在java中,它将如下所示: 所以有人能告诉我如何在小胡子中实现以上。我的意思是模板会是什么样子?我尝试了这个模板,但到目前为止还没有运气:( 所以当我运行这个模板时,输出

  • 然后我再做一次,但第二次完全不迭代。我花了很多时间调试它,最后将迭代程序转换为一个列表。 你们有谁知道原因吗? 编辑:对不起,如果我不清楚, 谢谢,Harendra

  • 问题内容: 所以我有一个json,我试图只获取活动用户的所有统计信息。当我尝试在for循环中执行以下操作时 它不起作用…但是只要没有记录,只要没有for循环就可以正常工作 这是我的html 这是我的js 这是一个演示链接http://jsfiddle.net/4kzzy/174/ 问题答案: 没什么复杂的,只是语法错误。 for循环需要这样写: 即没有多余的,没有多余的,也没有内部。 参见http

  • 本文向大家介绍groovy 在Java项目上使用Groovy,包括了groovy 在Java项目上使用Groovy的使用技巧和注意事项,需要的朋友参考一下 示例 Groovy可以访问所有Java类,实际上Groovy类是Java类,可以直接由JVM运行。如果您正在从事Java项目,那么使用Groovy作为一种简单的脚本语言来与Java代码进行交互就变得很容易了。 为了使事情变得更好,几乎所有Jav