我在控制器上有以下代码
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不允许这样做?
答案 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。