Выполнить команду для последнего элемента в каждом () в Grails

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

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

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


person Jason MacLean    schedule 07.07.2011    source источник


Ответы (3)


Другим возможным решением является

tasks.eachWithIndex() { task, i ->
//whatever
   if(i == tasks.size() - 1){
      //something else
   }
}
person Alex Such    schedule 07.07.2011
comment
должно быть size() - использование size работает только в Sun JDK, поскольку оно обращается к частному полю - person Burt Beckwith; 07.07.2011

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

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

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


изменить

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

// 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]

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

person tim_yates    schedule 07.07.2011

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

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

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

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

person Paul Cager    schedule 07.07.2011
comment
Однако мне нужно избегать повторного запуска операции... Я мог бы просто подсчитать количество задач и выполнить итерацию по всем, кроме одной, но я ищу более чистую встроенную функцию для этого. - person Jason MacLean; 07.07.2011
comment
В самой последней задаче вы хотите запустить операцию в дополнение к обычной или вместо? Я прочитал ваш вопрос в смысле вдобавок. - person Paul Cager; 07.07.2011