如何在groovy中执行条件collectEntries

时间:2012-11-22 18:34:56

标签: dictionary collections groovy

是否可以进行像collect这样的条件收集条件?

4 个答案:

答案 0 :(得分:13)

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

应该这样做

答案 1 :(得分:5)

它不像Tim Yates's answer using findAll那样简洁;但只是为了记录,你可以使用collectEntries来做到这一点:

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

评估为

[c:3, d:4]

Using "${it.key}" as done in this answer是一个错误,该键最终将成为GStringImpl类的实例,而不是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]

尝试将GroovyStrings等同于普通字符串的代码即使字符串看起来相同也会评估为false,从而导致难以弄清楚的错误。

答案 2 :(得分:0)

这应该有效:

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

答案 3 :(得分:-1)

在添加其他内容后现在可以使用。谢谢

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