2016-01-10 6 views
5

Я конвертирую большой проект в Котлин. Были многочисленные проблемы. Я изучаю новые модели Котлина - один из них. Надеюсь, есть образец, который я могу использовать для решения этой проблемы.Как `продолжить` или` break` в `` `` `в цикле` while`, используя Kotlin

Вот код, который я пытаюсь достичь. Но, continue и break недействительны в заявлении when.

while (!mStopped && c.moveToNext()) { 

    val itemType = c.getInt() 
    when (itemType) { 
     1, 2 -> { 
      doSomething() 
      if (condition) 
       continue 
      doSomethingElse() 
     } 
    } 
    doTheLastStuff() 
} 

Это очень вырезанная версия кода. В исходном Java-коде было 100 строк строк внутри операторов switch и много continue и break.

То, что я пытаюсь достичь, состоит в продолжении выполнения в заявлении while. Что такое шаблон для этого в Котлин

+0

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

+1

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

ответ

5

Вы можете использовать labels для продолжения/перерыв ИЭ цикла:

[email protected] while (!mStopped && c.hasNext()) { 

    val itemType = c.next() 
    when (itemType) { 
     1, 2 -> { 
      doSomething() 
      if (condition()) 
       [email protected] 
      doSomethingElse() 
     } 
    } 
    doTheLastStuff() 
} 

Вот является соответствующая выдержка из документации:

Любое выражение в Котлин может быть отмечена меткой. Ярлыки имеют форму идентификатора , за которой следует знак @, например: abc @, fooBar @ являются допустимыми ярлыками (...) Разрыв, квалифицированный с меткой, переходит в точку выполнения справа после того, как цикл, отмеченный знаком это этикетка. A continue переходит к следующей итерации этого цикла .

5

Проблема здесь в том, что break и continue имеют специальное значение внутри when заявления, а именно нарушение и продолжая when себя, а не окружающих петли. Пока (kotlin 1.0) синтаксис еще не решен, поэтому функция не работает, несмотря на зарезервированные ключевые слова.

Чтобы решить эту проблему, используйте этикетки https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels:

[email protected] while (...) { 
    when (itemType) { 
     1 -> [email protected] 
     else -> [email protected] 
    } 
} 
Смежные вопросы