2016-09-27 121 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