Как сломать цикл foreach в xtend?

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

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

person lifeline2    schedule 27.09.2016    source источник


Ответы (3)


Вы можете попробовать что-то вроде этого

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

takeWhile выполняется лениво, поэтому он должен работать, как ожидалось, и прерываться в нужный момент (видимость памяти позволяет, я надеюсь, что monitor.cancelled изменчив).

Не уверен, как здесь проявляется флаг состояния, вам может потребоваться добавить проверку для него в одно или оба замыкания.

person Artur Biesiadowski    schedule 30.09.2016
comment
Хорошо, гораздо более лаконично, чем использование исключений! - person A.H.; 09.10.2016

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

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

Псевдокод:

try {
    arrayList.forEach[
        if (monitor.canceled) {
            throw new InterruptedException()
        }
        else {
            // Continue processing
        }
    ]
}
catch (InterruptedException e) {
    // Handle
}
person snorbi    schedule 27.09.2016
comment
спасибо снорби. Он работает отлично и отменяет монитор. Но только в режиме отладки в eclipse с точкой отладки в monitor.canceld... Во время выполнения/отключения точек отладки никогда не работает в eclipse. Как ни странно, никогда не останавливается в точке отладки, если я сначала запускаю задание, а затем также ставлю точку отладки. Я запускаю монитор внутри метода runInWorkspace() eclipse WorkspaceJob. - person lifeline2; 28.09.2016
comment
Извините, я не могу помочь без полного связанного кода. Я думаю, что в вашем приложении есть проблема с многопоточностью. Я предлагаю взглянуть на то, как ключевое слово volatile работает в Java, или, что еще лучше, вы должны использовать утилиты параллелизма, такие как AtomicBoolean. - person snorbi; 28.09.2016

Вы правы, прерывание и продолжение не поддерживаются Xtend. Переместите специальные функции break в java и используйте их в xtend.

person Nagaraj Kandoor    schedule 06.05.2019