2012-11-22 35 views

Trả lời

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

nên làm điều đó

0

này nên làm việc:

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

Ném NPE như cũ. Bạn cần một 'else [:]' –

4

Nó không phải là ngắn gọn như FindAll, tuy nhiên, chỉ dành riêng cho các bản ghi, bạn có thể sử dụng collectEntries để làm điều này:

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

đánh giá thành

[c:3, d:4] 

Using "${it.key}" as done in this answer dường như có vấn đề, khóa sẽ kết thúc là một phiên bản của lớp GStringImpl chứ không phải là Chuỗi.

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] 

không phải là điều bạn muốn: bằng cách đánh giá GroovyStrings với chuỗi bình thường sẽ đánh giá sai ngay cả khi các chuỗi trông giống hệt nhau.

Các vấn đề liên quan