2016-01-10 10 views
5

Sto convertendo un grande progetto in Kotlin. Ci sono state numerose sfide. Io sto imparando i nuovi modelli di Kotlin. Spero che ci sia un modello che posso usare per risolvere questo.Come `continue` o` break` in una istruzione `when` all'interno di un ciclo` while` usando Kotlin

Ecco il codice che sto tentando di raggiungere. Ma, continue e break non sono validi in una dichiarazione when.

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

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

Questa è una versione molto ridotta del codice. Il codice java originale aveva 100 di righe all'interno delle istruzioni switch e un sacco di continue e break.

Quello che sto cercando di ottenere è di continuare l'esecuzione indietro alla dichiarazione while. Qual è il modello per fare questo in Kotlin

+0

Dopo di che, forse vedere se è possibile attivare il ciclo in una funzione ricorsiva di coda, che può essere ottimizzato con tailrec di Kotlin "annotazione". –

+1

(Nota: questo non è un duplicato dell'altro, l'altro riguarda i loop funzionali, si tratta di loop non funzionali. Ho segnalato l'intervento del moderatore per "deselezionarlo come un duplicato, perché non lo è") –

risposta

5

È possibile utilizzare labels continuare/interrompere l'es ciclo:

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

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

Ecco un estratto rilevante da documentazione:

Qualsiasi espressione in Kotlin può essere contrassegnato con un'etichetta Etichette hanno la forma di un identificatore seguito dal segno @, ad esempio: abc @, FooBar @ sono etichette valide (...) Una rottura qualificato con un'etichetta salta al punto di esecuzione destra dopo il ciclo segnati quell'etichetta. Una continuazione procede alla successiva iterazione di di quel ciclo.

5

Il problema qui è che break e continue hanno un significato speciale all'interno di una dichiarazione when, vale a dire la rottura e continuando la when in sé, non il ciclo circostante. Per ora (kotlin 1.0) la sintassi non è ancora decisa, quindi la funzione non funziona, nonostante le parole chiave siano riservate.

Per risolvere questo problema, utilizzare etichette https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels:

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