Создайте список из другого списка, преобразуя каждый элемент в Groovy - PullRequest
18 голосов
/ 22 января 2010

У меня есть следующий код на контроллере

    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 ]

26 голосов
/ 22 января 2010

Разве вы не можете просто использовать оператор спреда и сделать:

lines = rawLines*.name

.

13 голосов
/ 05 января 2016

Tim_yates 'ответ является чистым решением, когда вы хотите вызвать метод (или свойство) для каждого элемента списка, чтобы преобразовать его, например ::

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

но если вы хотите вызвать метод из другого объекта или сделать что-то более сложное, вы можете использовать collect:

[1, 2, 3].collect {Math.cos(it * Math.PI)}
0 голосов
/ 22 января 2010

Что ж, если вы используете grails, почему вы просто не используете класс модели вместе с методом findAll?
Использование простого необработанного SQL должно быть сделано в исключительных случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...