Groovy:将值从映射中提取到集合中

Groovy:将值从映射中提取到集合中,groovy,collections,Groovy,Collections,这里棒极了。我有一节课要上Fizz: @Canonical class Fizz { Integer id String name } 在我的程序中,我通过它们的积分id字段组成它们的映射: // Here, each key of the map corresponds to the Fizz#id of its value // example: // allFizzes[1] = new Fizz(1, 'Foobar') // allFizzes[3004] = new Fiz

这里棒极了。我有一节课要上Fizz:

@Canonical
class Fizz {
  Integer id
  String name
}
在我的程序中,我通过它们的积分
id
字段组成它们的映射:

// Here, each key of the map corresponds to the Fizz#id of its value
// example:
// allFizzes[1] = new Fizz(1, 'Foobar')
// allFizzes[3004] = new Fizz(3004, 'Wakka wakka')
Map<Integer,Fizz> allFizzes = getSomehow()
但是,这给了我运行时错误:

Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '24={
    "id": 24,
    "name": "Sampson"
},
  ' with class 'java.util.LinkedHashMap$Entry' to class 'java.util.Set'

因此,即使我指定了
v.equals('Sampson')
,Groovy仍在尝试将映射键、值对保存到
集合中。这里最常用的解决方案是什么?

您需要使用
findAll
(返回集合)代替
find
(返回对象)
findAll
将传入的闭包应用于映射中的每个入口集,并返回一个包含满足闭包条件的元素的新集合。然后可以对这个新返回的集合调用
values()

Map<String, Integer> myMap = ["fizzStrength":29, "fizzQuality": 123, "fizzFizziness":3]
Set<Integer> found = myMap.findAll { k,v -> v > 4 }.values() // returns [29, 123]
Map myMap=[“起泡强度”:29,“起泡质量”:123,“起泡性”:3]
Set found=myMap.findAll{k,v->v>4}.values()//返回[29123]

我相信您可能希望使用
findAll
而不是
find
findAll
返回集合,而
find
返回单个对象。此外,
v.equals('Sampson')
应该是
v.name=='Sampson'
Map<String, Integer> myMap = ["fizzStrength":29, "fizzQuality": 123, "fizzFizziness":3]
Set<Integer> found = myMap.findAll { k,v -> v > 4 }.values() // returns [29, 123]