Выполнить команду для последнего элемента в каждом () в Grails - PullRequest
2 голосов
/ 07 июля 2011

У меня есть массив «задач», которые я получаю из ответа JSON, который я перебираю, и выполняю некоторую обработку каждой задачи. Вот некоторый псевдокод:

def tasks = grails.converters.JSON.parse(json response)
tasks.each() {task ->
  //do some processing here
}

В самой последней задаче в списке я хочу выполнить дополнительную операцию. Я ищу встроенный способ сделать это в Grails / Groovy. Мои поиски пока не дали результатов.

Ответы [ 3 ]

7 голосов
/ 07 июля 2011

Другое возможное решение -

tasks.eachWithIndex() { task, i ->
//whatever
   if(i == tasks.size() - 1){
      //something else
   }
}
1 голос
/ 07 июля 2011

Другой метод может заключаться в том, чтобы сделать что-то вроде:

tasks[0..-1].each {
  // Processing for all but last element
}
tasks[-1   ].each {
  // Processing for last element
}

Конечно, если в списке tasks есть только один элемент, то к нему будут применены обе обработки (если в списке нет элементов, произойдет сбой): - /


edit

Альтернатива (которую нельзя считать легко читаемой), выглядит следующим образом:

// A list of 'tasks' in our case Strings
tasks = [
  'a', 'b', 'c'
]

// Create a list of Closures the length of our list of tasks - 1
processing = (1..<tasks.size()).collect { { task -> "Start $task" } }
// Append a Closure to perform on the last item in the list
processing << { task -> "Final $task" }

// Then, transpose these lists together, and execute the Closure against the task
def output = [tasks,processing].transpose().collect { task, func -> func( task ) }

После запуска output равно:

[Start a, Start b, Final c]

И это работает со списками задач только с одним элементом

0 голосов
/ 07 июля 2011

Я думаю, что вам нужно примерно так:

tasks.each() {task ->
  //do some processing here
}
tasks[-1].doSomethingElse()

(при условии tasks.size ()> 0).

Синтаксис [-1] означает последний всписок.

...