2016-01-10 5 views
5

Zamieniam duży projekt na Kotlin. Było wiele wyzwań. Ja ucząc się nowych wzorów Kotlin jest jednym z nich. Mam nadzieję, że istnieje wzorzec, którego mogę użyć, aby rozwiązać ten problem.Jak `kontynuować` lub` break` w instrukcji `when` wewnątrz pętli` while` używając Kotlin

Oto kod, który próbuję osiągnąć. Jednak continue i break nie są ważne w instrukcji when.

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

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

To jest bardzo uproszczona wersja kodu. Oryginalny kod języka Java zawierał 100 linii w instrukcjach przełączników i wiele numerów continue i break.

To, co próbuję osiągnąć, to kontynuowanie egzekucji na oświadczeniu while. Jaki jest wzór dla tej operacji w Kotlin

+0

Po tym, może sprawdzić, czy można obrócić pętlę do ogona funkcji rekurencyjnej, który może być zoptymalizowany z tailrec Kotlin za „adnotacji”. –

+1

(Uwaga: nie jest to duplikat drugiego, drugi dotyczy pętli funkcjonalnych, dotyczy to pętli niefunkcjonalnych .Zagrałem w celu interwencji moderatora, aby "usunąć to jako dupe, ponieważ tak nie jest") –

Odpowiedz

5

Można użyć labels kontynuować/przerwać IE pętli:

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

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

Oto jest istotnym fragmentem dokumentacji:

Dowolne wyrażenie w Kotlin może być oznaczony etykietą. Etykiety mają postać postaci identyfikatora, po której następuje znak @, na przykład: abc @, fooBar @ są prawidłowymi etykietami (...) Przerwa zakwalifikowana z etykietą przeskakuje do punktu wykonania w prawo po pętli oznaczonej tę etykietę. Kontynuacja przechodzi do następnej iteracji tej pętli.

5

Kwestia jest taka, że ​​break i continue mają specjalne znaczenie wewnątrz when rachunku, czyli łamanie i kontynuując when się, a nie otaczające pętlę. Na razie (kotlin 1.0) składnia nie jest jeszcze ustalona, ​​więc funkcja nie działa, pomimo zarezerwowania słów kluczowych.

Aby rozwiązać ten problem, należy używać etykiet https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels:

[email protected] while (...) { 
    when (itemType) { 
     1 -> [email protected] 
     else -> [email protected] 
    } 
}