Dive into Coding Life

KotlinLearning: 02-4 繰り返し文

Kotlinには繰り返し処理の文法としてfor文とwhile文があります。

while文

while文は単純なwhile文の他に、do while文があります。
while文に関してはJavaと同じですので特別なことはありません。

//条件式が真である間、処理を続ける
while(条件式) {
  //何らかの処理
}
//一度何らかの処理を実行した後、
//条件式を判断し真である間、処理を続ける
do {
  //何らかの処理
} while(条件式)

while文では繰り返し処理が確実に終了するよう、条件に注意しましょう。
一般的には以下の二種類があるかと思います。

  • 何らかの処理によって条件式の結果が変わる
  • 何らかの処理の中にループを抜ける処理がある

for文

Kotlinのfor文はJavaと大きく異なり、forEach形式のもののみとなります。
思えばJavaのfor文は如何にもコンピューターの為に設計され多様な文法でしたね。

for(int i = 0; i < list.size(); i++) {}

Kotlinでのfor文による繰り返し処理はiterator()を使い、コレクションなどから値を取り出し、1つずつ処理をするという前提から設計されています。
Javaのようなfor文を書きたい場合も、この設計を上手く使って繰り返し処理を記述します。

inとRange(レンジ)

KotlinでJavaと同様のfor文を書く場合、inとレンジを使います。
レンジは..で表される範囲を持った値です。

for(i in 1..100) {}

これはJavaの以下のfor文と同じものです。
レンジは開始の値と終わりの値を含んでいることに注意しましょう。

for(int i = 1; i <= 100; i++) {}

until

終わりの値を含みたくない場合、レンジではなくuntilを使用します。

for(i in 1 until 100) {}

for文の操作

Kotlinのfor文は柔軟で、for文の中で逆順にすることや刻み値を指定することも出来ます。

for(i in 100 downTo 1 step 2) {}

レンジは文字に対しても使用できます。

val binaryReps = TreeMap() //TreeMapはキーでソートされる
for(c in 'A'..'F') {
  //ASCIIコードをバイナリー地に変換
  val binary = Integer.toBinaryString(c.toInt())
  binaryReps[c] = binary
}
//Mapのキーと値を同時に取り出す
for((letter, binary) in binaryReps) {
  println("$letter = $binary")
}

Listなどのコレクションの場合withIndex()を使い、添え字と値を同時に取り出すことができます。

val list = arrayListOf("A", "B", "C")
for((index, element) in list.withIndex()) {
  println("$index: $element")
}

inのその他の使い方

inやその否定の!inがfor文の条件以外で使われる場合、ある値がコレクションやレンジに含まれているか確認する処理に使うことができます。

fun isLetter(c: Char) = c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'

これらは内部的には以下のような形に変換されます。

a <= c && c <= z || a <= A && c <= Z

このことから、inや!inはwhen式の分岐条件にも使えます。

inで比較できるものは数字や文字のみでなく、Comparableインターフェースを実装しているあらゆる比較可能なクラスが対象になります。

その他の繰り返し処理

それ以外にforEach()やrepeat()といった繰り返し処理を行う関数がありますが、これらは文法ではなく関数(高階関数)です。