2011-07-07 3 views
2

私は、反復処理中のJSONレスポンスから戻ってくるタスクの配列を持っています。いくつかのpsudocodeがあります:Grailsのeach()の最後の項目でコマンドを実行します

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

リストの最後のタスクで、追加の操作を実行します。私はgrails/groovyでこれを行う方法で建てられたものを探しています。私の検索ではこれまでのところ結果が得られていません。 (tasks.size()> 0を提供)

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

:私は何が必要だと思う

答えて

7

別の可能な解決策は、別の方法での線に沿って何かをするかもしれません

tasks.eachWithIndex() { task, i -> 
//whatever 
    if(i == tasks.size() - 1){ 
     //something else 
    } 
} 
+1

は 'size()'でなければなりません。 'size'を使うことは、プライベートフィールド –

+0

にアクセスしているので、Sun JDKでのみ機能します。訂正ありがとう –

0

の線に沿っています。

[-1]構文は、リストの最後を意味します。

+0

私は操作を2回実行することを避ける必要があります...私は可能性がありますjusタスク数のカウントを取得し、1つを除いてすべてを繰り返しますが、私はそれを行うための関数を組み込んだクリーナーを探しています。 –

+0

最後のタスクでは、通常のものに加えて_ _それとも_instead_に_演算を実行したいですか?あなたの質問を読んで_さらに_を意味しています。 –

1

である:それは意志、tasksリスト中の一つだけの要素があるかどうもちろん、

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

両方の処理が適用されます(リストに要素がない場合はクラッシュします)。 -/


編集

(として読みやすいと考えられなくてもよい)別の、以下の通りである:

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

そしてこれはただ1つの項目を持つタスクリストで動作します

関連する問題