Groovy中无需嵌套循环提取列表重复名称的单行实现方法
一行代码搞定Groovy重复名称提取(无嵌套循环)
当然可以!而且完全不用嵌套循环,一行代码就能实现需求。不过先小纠正下:你给出的结构其实是Groovy Map(键值对形式),不是List,但这完全不影响咱们的实现。
直接上单行解决方案:
list.values().collect { it.name }.countBy { it }.findAll { it.value > 1 }.keySet().toList()
我给你拆解下每一步的作用,方便理解:
list.values():先把Map里所有的对象(也就是object1、object2、object3对应的值)提取出来,得到对象集合collect { it.name }:遍历每个对象,取出name属性,得到列表["Tom", "Mary", "Tom"]countBy { it }:按名称统计出现次数,生成一个统计Map:[Tom:2, Mary:1]findAll { it.value > 1 }:筛选出出现次数大于1的条目,剩下[Tom:2]keySet().toList():取出这些条目的键(也就是重复的名称),转成List,最终得到预期的["Tom"]
如果你的数据结构其实是标准List(比如每个元素是带id和name的对象,没有object1这类键),那代码更简洁,去掉.values()就行:
list.collect { it.name }.countBy { it }.findAll { it.value > 1 }.keySet().toList()
整个过程全程用Groovy的内置高阶函数,没有手动写任何嵌套循环,完全符合你的要求~
内容的提问来源于stack exchange,提问作者ssss
相关产品推荐
相关产品推荐

