Czy można wykonać warunkowe metody collectEntries, takie jak collect?W jaki sposób mogę wykonać warunkową metodę collectEntries w groovy
10
A
Odpowiedz
13
[ a:1, b:2, c:3, d:4 ].findAll { it.value > 2 }
powinien zrobić to
0
To powinno działać:
[a:1, b:2, c:3, d:4].collectEntries {
if (it.value > 2)
["${it.key}": it.value]
}
4
To nie jest tak zwięzły jak findAll jednak tylko dla porządku, można użyć collectEntries
to zrobić:
[ a:1, b:2, c:3, d:4 ].collectEntries {
it.value > 2 ? [(it.key) : it.value] : [:] }
co oznacza
[c:3, d:4]
Using "${it.key}" as done in this answer wydaje się być problematyczna, klucz zakończy się instancją klasy GStringImpl, a nie String.
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]
który nie jest to, co chcesz: zrównanie GroovyStrings do normalnych ciągów oceni false nawet gdy struny wyglądają identycznie.
Zgłasza NPE bez zmian. Potrzebujesz "else [:]' –