2016-09-27 4 views
1

У меня есть код: Который итерирует массивList до конца, хотя я не хочу этого. Я не знаю, как его разбить, поскольку у xtend нет инструкции break. Если я не могу преобразовать то же самое в цикл while, есть ли альтернативный способ в xtend, аналогичный выражению break в java?Как разорвать петлю foreach в xtend?

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

Вы правы, break и continue не поддерживается Xtend.

Потому что кажется, что вы хотите «сломать» на основе внешнего условия (поэтому вы не можете использовать, например, фильтрацию). Я думаю, что это не плохая опция для исключения.

Псевдо код:

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

спасибо snorbi. Он отлично работает и отменяет монитор. Но только в режиме отладки в eclipse с точкой отладки на monitor.canceld ... Во время выполнения/отключения точек отладки никогда не работает в eclipse. Странно никогда не останавливается в точке отладки, если я сначала запускаю задание, а затем поставлю точку отладки. Я запускаю монитор внутри метода runInWorkspace() для eclipse WorkspaceJob. – lifeline2

+0

Извините, я не могу помочь без полного кода. Я думаю, что в вашем приложении есть многопоточная проблема. Я предлагаю взглянуть на то, как «летучее» ключевое слово работает на Java, или даже лучше вы должны использовать утилиты параллелизма, такие как AtomicBoolean. – snorbi

Смежные вопросы