Как я могу сделать условные collectEntries в groovy

можно ли сделать условные collectEntries, такие как collect ?

3 ответов


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

должны сделать это


это не так лаконично, как ответ Тима Йейтса с помощью findAll; но только для записи, вы can использовать collectEntries для этого:

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

который оценивает в

[c:3, d:4]

использование " ${it.key} " как сделано в этом ответе является ошибкой, ключ в конечном итоге будет экземпляром класса 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, даже если строки выглядят идентично, в результате чего трудно понять ошибку.


Это должно работать:

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