kotlinのサンプルプログラムを見ていると見たことがない演算子を見かけることがありました。Googleで検索しても、なかなかヒットせず苦労したので、調べた内容を備忘録としてまとめました。
「.?」safe call operator(ドット クエスチョンマーク)
nullableな型の変数のプロパティにアクセスするときに、NullPointerExceptionが起きないように、アクセスできます。
?.を使うと、アクセスしようとしている変数がnullの場合はnullを返し、そうでない場合はそのプロパティの値を返します。
Kotlin
val a: String? = null
val b: String? = "hello"
println(a?.length) // null
println(b?.length) // 5
変数aはnullなのでnull、変数bはnullじゃないので、lengthプロパティの値に評価されます。
「:?」エルビス演算子(コロン はてなマーク)
エルヴィス・プレスリーの髪形に似ていることから、その名がついたエルビス演算子😕。この演算子は、演算子の左側がnullじゃない場合は、左の式を返し、nullの場合は右の式を返します。
まずはエルビス演算子を使わない場合を見てみます。
Kotlin
val c: String? = "Elvis"
val d: String? = null
val length1: Int = if (c != null) c.length else -1
val length2: Int = if (d != null) d.length else -1
println(length1) // 5
println(length2) // -1
エルビス演算子を使うとこのように書けます。上のコードに比べてコードが短く読みやすいですね。
Kotlin
val c: String? = "Elvis"
val d: String? = null
val length1: Int = c?.length ?: -1
val length2: Int = d?.length ?: -1
println(length1) // 5
println(length2) // -1
「!!」not-null assertion operator(ビックリマーク2つ/エクスクラメーションマーク2つ)
nullableな型の変数をnon-nullableに変換させる演算子です。
Kotlin
val e: String? = "nullable"
prinln(e!!.length) // 8
変数eはnullableですが、この場合明らかにnullではないので!!演算子を使い、non-nullableに変換しています。
Kotlin
val f: String? = null
println(f!!.length) // NullPointerException
一方で、fはnullableでnullが代入されているので、!!演算子を使うとNullPointerExceptionが起きてしまいます。
この演算子の使いどころがいまいちわからないので、わかる方教えていただけたら嬉しいです。