Có thể thực hiện một collectEntries có điều kiện như thu thập không?Làm thế nào tôi có thể thực hiện một sưu tập có điều kiện trong groovy
10
A
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]
}
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.
Ném NPE như cũ. Bạn cần một 'else [:]' –