Groovy:从Map中取出值并进入Set

时间:2018-03-28 14:30:38

标签: groovy collections

Groovy在这里。我有一个班级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()

我知道要获得一组“坏”的Fizzes,其name等于字符串'Sampson'。我最好的尝试:

Set<Fizz> badFizzes = allFizzes.find { k,v -> v.equals('Sampson') }

然而,这给了我运行时错误:

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仍然试图将Map键值对保存到Set。什么是 Grooviest 解决方案?

1 个答案:

答案 0 :(得分:1)

您需要使用findAll(返回一个Collection)代替find(返回一个Object)。 findAll将传入的闭包应用于Map中的每个EntrySet,并返回一个包含满足闭包标准的元素的新集合。然后,您可以在此新返回的集合上调用values()

Map<String, Integer> myMap = ["fizzStrength":29, "fizzQuality": 123, "fizzFizziness":3]
Set<Integer> found = myMap.findAll { k,v -> v > 4 }.values() // returns [29, 123]