2012-11-22 90 views

回答

13
[ a:1, b:2, c:3, d:4 ].findAll { it.value > 2 } 

應該這樣做

0

這應該工作:

[a:1, b:2, c:3, d:4].collectEntries { 
    if (it.value > 2) 
     ["${it.key}": it.value] 
} 
+5

按原樣投射NPE。你需要一個'else [:]' –

4

這不是簡明扼要的findAll,然而,僅僅是爲了記錄,你可以使用collectEntries做到這一點:

[ a:1, b:2, c:3, d:4 ].collectEntries { 
    it.value > 2 ? [(it.key) : it.value] : [:] } 

其中評價爲

[c:3, d:4] 

Using "${it.key}" as done in this answer似乎有問題,關鍵將最終成爲GStringImpl類的一個實例,而不是字符串。

groovy:000> m = [ a:1, b:2, c:3, d:4 ] 
===> [a:1, b:2, c:3, d:4] 
groovy:000> m.collectEntries { ["${it.key}" : it.value ] } 
===> [a:1, b:2, c:3, d:4] 
groovy:000> _.keySet().each { println(it.class) } 
class org.codehaus.groovy.runtime.GStringImpl 
class org.codehaus.groovy.runtime.GStringImpl 
class org.codehaus.groovy.runtime.GStringImpl 
class org.codehaus.groovy.runtime.GStringImpl 
===> [a, b, c, d] 

這是不是你想要的東西:等同GroovyStrings正常字符串將評估爲false即使字符串看起來相同。