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

Groovy实现按嵌套commit的created_at排序并提取名称数组

嘿,我来帮你搞定这个按commit的created_at字段排序标签名称的需求!

首先你之前的顾虑其实是多余的——Groovy的sort方法完全能处理包含LazyMap的ArrayList,因为LazyMap本质上还是Map的实现,Groovy的动态属性访问可以轻松拿到嵌套的commit.created_at字段,根本不用纠结这个问题~

咱们直接修改你的代码,核心逻辑就是先对返回的标签列表按指定字段排序,再提取名称。这里要注意一个关键点:GitLab返回的created_at是字符串格式,直接按字符串排序可能会出问题(比如不同格式的日期字符串排序逻辑混乱),所以最好转成Date对象再比较,这样排序才准确。

下面是修改后的完整代码:

def url = "curl -X GET http://blah_blah"
def payload = url.execute().text
def slurper = new JsonSlurper()
def response = slurper.parseText(payload)

// 按commit的created_at升序排序(最早的commit在前),转成Date确保排序逻辑正确
def sortedTagsResponse = response.sort { tagItem ->
    // 这里的日期格式要和GitLab返回的一致,GitLab通常返回ISO8601格式:yyyy-MM-dd'T'HH:mm:ss'Z'
    Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", tagItem.commit.created_at)
}

// 提取排序后的标签名称列表,用collect比循环add更简洁
List<String> sortedTags = sortedTagsResponse.collect { it.name }

println(sortedTags)

如果想要降序排序(最新的commit在前),有两种简单的方式:

  • 方式一:在排序时取日期的负值(利用数值排序的反转逻辑)
    def sortedTagsResponse = response.sort { tagItem ->
        -Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", tagItem.commit.created_at)
    }
    
  • 方式二:排序后调用reverse()方法反转列表
    def sortedTagsResponse = response.sort { tagItem ->
        Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", tagItem.commit.created_at)
    }.reverse()
    

另外,你原来的循环添加名称的方式也能工作,但Groovy的collect方法更符合语言风格,代码更简洁易读,推荐使用~

内容的提问来源于stack exchange,提问作者Frak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:54