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
相关产品推荐
相关产品推荐

