2016-01-10 7 views
5

大きなプロジェクトをKotlinに変換しています。多くの課題がありました。私はKotlinの新しいパターンを学ぶことの一つです。うまくいけば、私はこれを解決するために使用できるパターンがあります。Kotlinを使って `while`ループ内で` when`文を `continue`または` break`する方法

これは私が達成しようとしているコードです。ただし、continuebreakwhenステートメントでは無効です。

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

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

これはコードの非常に短いバージョンです。元のjavaコードはswitch文の中に100行あり、continuebreakのものがたくさんありました。

私が達成しようとしているのは、whileステートメントで実行をやり直すことです。何をループすなわちを破る/継続するlabelsを使用することができますKotlin

+0

、あなたはKotlinのtailrec「注釈」を最適化することができ、末尾再帰関数にループを回すことができるかどうか、多分参照してください。 –

+1

(注:これは他のものと重複していません。もう1つは機能ループについてです。これは機能していないループに関するものです。 –

答えて

5

でこれを行うためのパターンです:

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

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

ここのは、ドキュメントから関連の抜粋です。

Kotlinで任意の式ラベルを付けることができます。ラベルには の識別子の後に@記号が続きます。たとえば、abc @、 fooBar @は有効なラベルです(...) ラベルが付いているブレークは、マークされたループの後に実行ポイントにジャンプします そのラベル。継続は、そのループの次の 反復に進む。ここ

5

問題がbreakcontinue、すなわち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] 
    } 
} 
関連する問題