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

Groovy Map转换优化:如何更优雅地按值分组?

更具Groovy风格的Map分组实现方案

嘿,针对你这个把Map中相同值的键分组的需求,Groovy其实有更简洁、更符合其风格的写法,不用额外的复杂嵌套!

先明确下你的场景:
原始Map:

def myMap = [a: 1, b: 1, c: 2, d: 2, e: 1, f: 2]

期望结果:将相同值对应的键聚合,得到

[1: [a, b, e], 2: [c, d, f]]

你当前的实现是:

myMap.groupBy{it.value}.collectEntries{key, value -> [(key): value.keySet()]}

其实我们可以利用Groovy的语法糖简化这个过程,最地道的写法是:

myMap.groupBy { it.value }.collectEntries { [it.key, it.value*.key] }

为什么这个更Groovy?

  • 去掉了冗余的括号嵌套:Groovy中collectEntries的闭包如果返回一个二元List([键, 值]),会自动将其映射为条目,不需要写成[(key): value]这种形式
  • 使用*.key展开操作符:简洁地从groupBy返回的Entry集合中提取所有键,替代value.keySet(),可读性更强

如果你偏好更显式的写法,也可以这样写(本质和上面一致):

myMap.entrySet().groupBy { it.value }.collectEntries { k, entries -> [k, entries*.key] }

另外,如果你想原地修改groupBy的结果(不推荐,因为会改变原分组对象),也可以用这种更简洁的方式:

def grouped = myMap.groupBy { it.value }
grouped.each { it.value = it.value*.key }

不过最推荐的还是第一种collectEntries的简化写法,既保持了不可变性,又充分利用了Groovy的语法特性,代码更清爽易读~

内容的提问来源于stack exchange,提问作者More Than Five

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:08