Можно ли создать условный сбор данных, например collect?
Как я могу сделать условное collectEntries в groovy
Ответ 1
[ a:1, b:2, c:3, d:4 ].findAll { it.value > 2 }
должен сделать это
Ответ 2
Это не так лаконично, как findAll, однако, только для записи, вы можете использовать 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, даже если строки выглядят одинаково.
Ответ 3
Это должно работать:
[a:1, b:2, c:3, d:4].collectEntries {
if (it.value > 2)
["${it.key}": it.value]
}