从另一个列表生成一个列表,转换Groovy上的每个元素

时间:2010-01-22 08:01:11

标签: groovy

我在控制器上有以下代码

    def db = new Sql(dataSource)
    def rawLines = db.rows("SELECT name FROM LINES")
    def lines = []
    /*(db.rows returns the values as [NAME:value] */
    rawLines.each {
        lines.add(it.name)
    }
    /*Then, use lines */

我无法忽视这样一种印象:可能有一些方法以更优雅的方式做到这一点,类似于Python中的列表理解:

lines = [ l.name for l in db.rows("SELECT name FROM LINES") ]

必须声明一个空列表然后填充它似乎不是最好的做事方式...... 是否可以做这样的事情,或者Groovy不允许这样做?

3 个答案:

答案 0 :(得分:26)

你不能只使用点差运算符,并执行:

lines = rawLines*.name

(见http://docs.groovy-lang.org/latest/html/documentation/index.html#_spread_operator

答案 1 :(得分:13)

tim_yates'当你想在列表的每个元素上调用一个方法(或属性)来转换它时,答案是一个干净的解决方案,例如:

[1,2,3]*.multiply(5)

但是如果你想从另一个对象调用一个方法或做一些更复杂的事情,你可以使用collect

[1, 2, 3].collect {Math.cos(it * Math.PI)}

答案 2 :(得分:0)

那么,如果您使用的是grails,为什么不简单地将模型类与findAll方法一起使用?
在特殊情况下,应该使用纯原始SQL。

相关问题