2016-09-27 229 views
1

我有下面的代碼:哪個迭代arrayList直到結束,即使我不需要它。由於xtend沒有break語句,我不知道如何分解它。假如我不能將它轉換爲while循環,xtend中有沒有其他方法類似於java中的break語句?如何打破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是易失性的)。

不確定狀態標誌是如何進入圖片的,您可能需要在一個或兩個閉包中添加檢查。

+0

不錯,比使用異常更簡潔! –

2

你是對的,breakcontinue不被支持的Xtend。

因爲看起來你想基於外部條件'打破'(所以你不能使用例如過濾)我認爲這是一個不錯的選擇拋出異常。

僞代碼:

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

謝謝snorbi。它正在完美工作並取消顯示器。但只有在eclipse中的調試模式下,在monitor.canceld處有一個調試點...在運行時/禁用調試點時,絕不會在eclipse中工作。奇怪的是,如果我先運行這個工作,然後再把調試點也放在調試點上,那麼就不會停止。我在eclipse WorkspaceJob的runInWorkspace()方法內運行監視器。 – lifeline2

+0

對不起,如果沒有提供完整的相關代碼,我不禁感慨。我認爲你的應用程序中存在多線程問題。我建議看看「volatile」關鍵字在Java中的工作方式,或者更好的是應該使用像AtomicBoolean這樣的併發實用程序。 – snorbi