首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins- HashMap排序时,流水线用新值'-1‘替换变量

Jenkins- HashMap排序时,流水线用新值'-1‘替换变量
EN

Stack Overflow用户
提问于 2019-04-04 16:46:34
回答 1查看 302关注 0票数 2

首先,我创建了一个Map并用值填充它。然后,我想按值对映射进行排序。我使用了示例中的sort方法。在控制台的IDE中,我看到程序的行为符合我的期望。

然而,当我从groovy管道运行程序时,排序后发生了一件令人费解的事情。由于灵活的键入,Map被一个数字所取代。

代码语言:javascript
复制
node("Linux_Default") {
    Map painters = ["Rubens": 1, "Bosch": 2, "Repin": 5, "DaVinci": 10] as HashMap<String, Integer>
    println('unordered')
    for (String i : painters) {
        println('* ' + i)
    }

    def sortedPainters = painters.sort(){ a, b -> b.value <=> a.value }
    try {
        println('ordered')
        for (String i : sortedPainters) {
            println('* ' + i)
        }
    } catch (Exception e) {
        println(e.toString())
    }
}

IDE的输出

代码语言:javascript
复制
unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* DaVinci=10
* Repin=5
* Bosch=2
* Rubens=1

管道控制台的输出

代码语言:javascript
复制
Running in Durability level: PERFORMANCE_OPTIMIZED
Running on jenkins-agent-linux-008 in /u01/jenkins_slave/workspace/KMD/maps_sort_test
unordered
* Rubens=1
* Bosch=2
* Repin=5
* DaVinci=10
ordered
* -1
Finished: SUCCESS
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-04 17:00:26

在带有自定义闭包的Jenkins中,一些方法在CPS下没有得到很好的处理。解决方案是将有问题的代码隔离在@NonCPS闭包中,如:

代码语言:javascript
复制
@NonCPS
def getSorted(def map) {
    map.sort(){ a, b -> b.value <=> a.value }
}

然后,您将看到def sortedPainters = getSorted(painters)返回一个排序的映射,而不是一个奇怪的标量。

另请参阅:

Jenkins sort method behaviour not as expected

pipeline groovy script - Sort a list with custom comparator or closure not sorting

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55511584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档