別の質問では、ユーザーは次のようなコードを書くことを提案しました。
def list = ['a', 'b', 'c', 'd']
def i = 0;
assert list.collect { [i++] } == [0, 1, 2, 3]
このようなコードは、他の言語では、collectのコンテンツがそのコンテキストの状態を変更するため(ここではの値を変更するため)、悪い習慣と見なされますi
。言い換えれば、閉鎖には副作用があります。
このような高階関数は、クロージャを並行して実行し、新しいリストに再度アセンブルできる必要があります。クロージャでの処理が長く、CPUを集中的に使用する操作である場合は、それらを別々のスレッドで実行する価値があるかもしれません。collect
それを達成するためにを使用するように変更するのは簡単ExecutorCompletionService
ですが、それは上記のコードを壊します。
問題の別の例は、何らかの理由collect
で、たとえば逆の順序でコレクションを参照する場合です。この場合、結果はになります[3, 2, 1, 0]
。この場合、リストは元に戻されていないことに注意してください。0は、実際には「d」にクロージャを適用した結果です。
興味深いことに、これらの関数は、コレクションのJavaDocの「このコレクションを反復処理する」で文書化されています。これは、反復がシーケンシャルであることを示しています。
groovy仕様は、またはのような高階関数で実行の順序を明示的に定義していますcollect
かeach
?上記のコードは壊れていますか、それとも大丈夫ですか?