2016-09-27 11 views
1

私は以下のコードを持っています。私はxtendがbreakステートメントを持っていないので、それを壊す方法を知らない。同じループをwhileループに変換できない場合は、Javaのbreak文に似たxtendの代替方法がありますか?あなたは正しいですxtendでforeachループを壊す方法は?

arrayList.forEach [ listElement | if (statusFlag){ 
    if(monitor.canceled){ 
      statusFlag = Status.CANCEL_STATUS 
      return 
    } 
    else{ 
      //do some stuff with listElement 
    }  
}] 

答えて

3

あなたはその

arrayList.takeWhile[!monitor.cancelled].forEach[ ... do stuff ...] 
if (monitor.cancelled) { statusFlag = Status.CANCEL_STATUS } 

takeWhileような何かを試すことができ、それが期待どおりに動作して、私は願っています(メモリの可視性が許可する正しい瞬間に壊す必要があるので、ゆったりと実行されますmonitor.cancelledはvolatileです)。

ステータスフラグがここにどのように表示されるかわからない場合は、1つまたは両方のクロージャでもチェックを追加する必要があります。

+0

例外を使用するよりもはるかに簡潔です。 –

2

breakcontinueはXTENDでサポートされていません。

外部条件に基づいて「中断したい」と思われるため(例:フィルタリングは使用できません)、例外をスローするのは悪い選択肢ではないと思います。

擬似コード:

try { 
    arrayList.forEach[ 
     if (monitor.canceled) { 
      throw new InterruptedException() 
     } 
     else { 
      // Continue processing 
     } 
    ] 
} 
catch (InterruptedException e) { 
    // Handle 
} 
+0

ありがとうsnorbi。それは完全に動作しており、モニターをキャンセルします。しかし、monitor.canceldのデバッグポイントを持つEclipseのデバッグモードでのみ...実行時/デバッグポイントを無効にすると、Eclipseでは動作しません。私が最初にジョブを実行してからデバッグポイントを置くと、デバッグポイントで停止することは間違いありません。 Eclipse WorkspaceJobのrunInWorkspace()メソッド内でモニターを実行しています。 – lifeline2

+0

申し訳ありませんが、提供されている完全な関連コードなしでは手伝いできません。あなたのアプリケーションにはマルチスレッドの問題があると思います。私は、 "volatile"キーワードがJavaでどのように動作するかを見てみることをお勧めします。また、AtomicBooleanのような同時実行ユーティリティを使用する方がよいでしょう。 – snorbi

関連する問題