KotlinでAndroid-No.05(フロー制御)

対象バージョン:Android Studio v4.1, Kotlin v1.4

フロー制御

今回はKotlinのフロー制御を確認していきます。

ただし、全てをみるというよりは、他の言語で利用するようなフロー制御をKotlinでどうやって記述するかがメインとなります。

前置き

ここで紹介している内容は、僕自身がKotlinでプログラミングする上で必要と思う事を記載しています。(ほぼ備忘録です)

間違いや、不足部分、正しくない使い方も多々あると思いますので、記載内容に疑問がある場合はKotlinの正式なサイトや、他の方の記事も参考にしてみてください。

条件分岐

とりあえず、必ず使うであろう条件分岐から確認していきます。

if文

必ず使うであろうif文です。

一般的な使い方

条件分岐については、他言語と使い方はほぼ同じです。

val a = 0
val b = 1
if(a == b)
{
    editTextResult.append("a is equal to b" + System.lineSeparator())
    if(a == 0 && b == 0)
    {
        editTextResult.append("Both a and b are zero" + System.lineSeparator())
    }
}
else if(a > b)
{
    editTextResult.append("a is bigger than b" + System.lineSeparator())
}
else
{
    editTextResult.append("a is smaller than b" + System.lineSeparator())
}

比較演算子

比較演算子は、他の言語とほぼ同じです。

演算子意味
==等しいa == b
「aとbは等しい」
!=等しくないa != b
「aとbは等しくない」
>より大きいa > b
「aはbより大きい」
>=以上a >= b
「aはb以上」
<より小さいa < b
「aはbより小さい」
<=以下a <= b
「aはb以下」

※Kotlinにはイコール記号を3つ使った「===」(identity equality)というものも存在しているので、タイプミスには気を付けましょう。

また、符号付き(Signed)の数字と、符号無し(Unsigned)の数字の比較はエラーになるので注意しましょう。

論理演算子

論理演算子は他の言語と変わりはないです。

演算子意味
&&AND(論理積)a == 0 && b == 0
(a==0 かつ b == 0)
||OR(論理和)a == 0 || b == 0
(a==0 または b == 0)
!NOT(否定)!(a==0)
(a==0でない)

※Kotlinには「and」「or」がありますが、こちらはビット演算子なので間違えない様にしましょう。

if文で値を返す

Kotlinで面白いのは、if文が値を返す事が出来るという事です。

上の条件分岐でメッセージ(文字列)を返すような形に置き換えると、下記の様になります。

val a = 0
val b = 1
val msg = if(a == b)
    {
        if(a == 0 && b == 0)
        {
            "Both a and b are zero"
        }
        else
        {
            "a is equal to b"
        }
    }
    else if(a > b)
    {
        "a is bigger than b"
    }
   else
    {
        "a is smaller than b"
    }
editTextResult.append(msg + System.lineSeparator())

注意として、if文のすべての条件分岐で同じ型を返す様にする必要があります。

Kotlinには「(a > b?a:b)」の様な三項演算子はありませんが、if文で代用する事が出来ます。

//val c = (a>b?a:b) // 三項演算はない
val c = if(a > b) a else b // a,b の大きい方を設定

条件式はBoolean型のみ

整数型の変数を用いて「0以外ならtrue、0ならfalse」の様な使い方は出来ません。

まぁ、本来論理式が入る部分で、バグが入り込みやすいから、横着するなという事でしょう^^;

switch文(はありません)

Kotlinにswitch文はありません…。(個人的にはよく使うのですが…)

代わりに(?)、When文が存在します。

when文

KotlinのWhen文は、他の言語のSwitch文に似た使い方になるかと思います。

when文の構文

ざっくりとしたWhen文の構文は下記の様になります。(若干怪しいですが…^^;)

when(変数)
{
    値1 -> { (ブロック1) }
    値2 -> { (ブロック2) }
    else -> { (ブロック3) }
}

※個人的には「->」の書き方は、比較演算子と似ているので、あまり好きではないのですが、Kotlinではいろんな所に出てくるので、慣れるしかにですね…^^;

上記では、
『「変数」の値が「値1」なら「ブロック1」を実行し、
 「変数」の値が「値2」なら「ブロック2」を実行し、
 「変数」の値がそれ以外なら「ブロック3」を実行する』
というような動作になる事をしめしています。

ブロック内が1行の処理なら、カッコ{}は省略できます。

val a : Int = 0
when(a)
{
    0 -> editTextResult.append("a is 0" + System.lineSeparator())
    1 -> editTextResult.append("a is 1" + System.lineSeparator())
    2 -> editTextResult.append("a is 2" + System.lineSeparator())
    else -> editTextResult.append("a is other" + System.lineSeparator())
}

値の評価部分は、型チェックを記載する事も出来ますが、個人的にはあまり使い道が思い浮かびません…^^;

    is Int ->  editTextResult.append("a is Int" + System.lineSeparator())

when文も値を返す

if文と同様に値を返すwhen文も記述する事が出来ます。

val a : Int = 0
val msg : String =
    when(a)
    {
        0 -> "a is 0"
        1 -> "a is 1"
        2 -> "a is 2"
        else -> "a is other"
    }
editTextResult.append( msg + System.lineSeparator())

※値を返す場合は、「else」行が必須になります。

複数の値の評価

他の言語のswitch文で下記の様な「値が値1か値2だった場合に、この処理をする」みたいな使い方は、Kotlinのwhen文では値を「,」(カンマ)で並べて記載します。

switch(a)
{
    // 0 または 1の時の処理
  	case 0:
  	case 1:
    	editTextResult.append("a is 0 or 1" + System.lineSeparator())
    	break;
 	 case 2:
    	editTextResult.append("a is 2" + System.lineSeparator())
   	 	break;
  	default:
    	editTextResult.append("a is other" + System.lineSeparator())
    	break;
}
when(a)
{
    // 0 または 1の時の処理
    0, 1 -> editTextResult.append("a is 0 or 1" + System.lineSeparator())
    2 -> editTextResult.append("a is 2" + System.lineSeparator())
    else -> editTextResult.append("a is other" + System.lineSeparator())
}

Javaのコードと並べると、Kotlinがコードが簡潔に書けるようになっている事が分かりますね。(良い事ととるか、悪い事ととるかは人それぞれでしょうけど…)

ループ処理

プログラミングに欠かせないループ処理の記述の方法について見ていきます。

forループ

繰り返し処理を行うためのループ処理です。

昇順の繰り返し

例えば1から100までの和を求めるような処理の場合は、下記の様になります。

var sum : Int = 0
for(i in 1..100)
{
    sum += i
}
 editTextResult.append("SUM = " + sum + System.lineSeparator())

for()の「i」には「var」や「val」は不要です。
また、forの中で「i」の値を割り当てる事は出来ません。

「in 1..100」部分で繰り返しの範囲を指定します。
開始値と終了値を変数で与える事も可能です。

 var sum : Int = 0
 val from = 1
 val to = 10
 for(i in from..to)
 {
      sum += i
 }

下記の注意点があります。

  • 開始値、終了値に浮動小数点は指定できません。
  • 開始値または終了値にLong型を指定すると、「i」の型はLongになります。Long以外の場合は、「i」はInt型になります。
  • 符号無し整数を指定する場合、開始値・終了値とも同じ型を指定する必要があります。また「i」は開始値・終了値に指定した型になります。

降順の繰り返し

「100から1まで」の様に降順の繰り返し処理を行う場合は、「for(i in 100..1)」ではなく、「downTo」を使って下記の様に記述します。

var sum : Int = 0
for(i in 100 downTo 1)
{
    sum += i
}

開始値・終了値の注意点は、昇順の場合と同じです。

ステップの指定

刻みちを指定する場合は、昇順・降順問わず「step <刻み値>」を追加します。

for(i in 1..100 step 2)
{
    sum += i
}

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

刻み値は1以上の整数を指定します。(マイナスを指定するとアプリが落ちます…T_T;)

※forループの使い方は、上記の他に、配列やリストなど、iteratorを持つクラスの要素を取り出す使い方もありますが、それについては別途記載します。

whileループ、do-whileループ

whileループ、do-whileループは他の言語と同じです。

// while loop
var a : Int = 0
while (a < 10)
{
    editTextResult.append("a = " + a + System.lineSeparator())
    a++
}

// do-while loop
a = 0
do{
    editTextResult.append("a = " + a + System.lineSeparator())
    a++
} while(a < 10)

Kotlinのフロー制御の特徴としては…

  • switch文はなく、when文が追加されている
  • if文、when文は値を返す事ができる
  • forループの書き方は独特(pythonとかに近い)

と言った感じでしょうか?

また、型が異なると比較や演算でエラーになるので、その辺はなれるまで、もやもやしそうです…^^;

次回予告

次回はコレクション(配列、リストなど)について見ていこうと思います。


前の記事次の記事
No.04(変数の宣言)No.06(コレクション)