0Pricing
Android Academy · レッスン

安全呼び出しとElvis

?.と?:演算子を学びます。

「安全呼び出しとElvis」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

ifチェックの先へ

すべてのNullableな値を if で確認する方法でも動作しますが、すぐに冗長になってしまいます。Kotlinには、null処理のために用意された簡潔な演算子があります。

このレッスンでは、安全呼び出し演算子 ?. とエルビス演算子 ?: という、頻繁に使う2つのツールを扱います。

安全呼び出し演算子

?. 演算子は、値がnullではない場合にだけメソッドを呼び出します。nullの場合はクラッシュせず、式全体が null と評価されます。

これは、nullではない場合だけ処理するパターンを安全に短く書く方法です。

fun main() {
    val name: String? = "Coddy"
    println(name?.length)
}

nullに対する安全呼び出し

レシーバーがnullの場合、安全呼び出しはそこで処理を短絡し、null を返します。例外は発生しません。

ここで出力されるのはクラッシュではなく、nullという文字列です。

fun main() {
    val name: String? = null
    println(name?.length)  // prints: null
}

安全呼び出しを連結する

複数の処理にわたって ?. を連結できます。どこか1つでもnullになると、連結全体が停止して null になります。

入れ子になった任意データをたどる場合に最適です。

class Address(val city: String?)
class User(val address: Address?)

fun cityOf(u: User?): String? {
    return u?.address?.city
}

エルビス演算子

エルビス演算子 ?: は、左辺がnullの場合に代替値を提供します。この記号が歌手の髪型に似ていることから、この名前が付いています。

「左の値を使い、そうでなければ右の値を使う」と読みます。

fun main() {
    val name: String? = null
    val shown = name ?: "Guest"
    println(shown)  // prints: Guest
}

安全呼び出しとエルビス演算子

安全呼び出しとエルビス演算子は相性がよく、一緒に使えます。?. で値の中をたどり、途中でnullになった場合は ?: でデフォルト値を指定します。

このパターンにより、Nullableな結果を必ず非nullの値に変換できます。

fun main() {
    val name: String? = null
    val len: Int = name?.length ?: 0
    println(len)  // prints: 0
}

デフォルトの長さの例

ここでの結果の型は Int? ではなく、通常の Int です。エルビス演算子によってNullableではなくなりました。

?: の後に非nullの代替値を指定すると、コンパイラーはその値が決してnullにならないことを把握できます。

val title: String? = "Kotlin"
val length: Int = title?.length ?: 0
// length is a non-null Int

早期returnにエルビス演算子を使う

Kotlinでは return と throw が式であるため、エルビス演算子の右辺に置けます。

必要な値がない場合に、早い段階で処理を終了するすっきりした方法です。

fun process(input: String?) {
    val text = input ?: return
    println(text.uppercase())
}

letを使った安全呼び出し

?. と let を組み合わせると、値がnullではない場合だけブロックを実行できます。ブロック内では値は非nullで、it という名前で参照できます。

任意の値に対して処理を行うときによく使われるイディオムです。

fun main() {
    val email: String? = "a@b.com"
    email?.let {
        println("Sending to " + it)
    }
}

まとめて使う

短いプログラムで、安全呼び出しとエルビス演算子を組み合わせて親切なメッセージを作る方法を示せます。

if 文は必要ありませんが、nullによるクラッシュの危険もないことに注目してください。

fun main() {
    val nickname: String? = null
    val display = nickname?.uppercase() ?: "ANONYMOUS"
    println(display)
}

どちらを使うべきか

nullの結果を問題なくそのまま流したい場合は ?. を使います。nullを具体的なデフォルト値に置き換えたい場合は ?: を使います。

この2つを組み合わせると、冗長なチェックをせずに、日常的なnull処理の大部分に対応できます。

val count = list?.size ?: 0
// safe call reads size, Elvis defaults to 0

クイックチェック

安全呼び出しとエルビス演算子についての理解度を確認しましょう。

まとめ

安全呼び出し ?. は、レシーバーがnullではない場合だけメンバーを呼び出し、nullの場合は null を返します。エルビス演算子 ?: は、nullを代替値に置き換えます。

この2つを連結すると、Nullableであることをすっきり取り除けます。次は、let や also などのスコープ関数について詳しく学びます。

よくある質問

「安全呼び出しとElvis」レッスンは無料ですか?

はい。「安全呼び出しとElvis」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「安全呼び出しとElvis」で何を学びますか?

?.と?:演算子を学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「安全呼び出しとElvis」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Nullable型とNon-Null型
  2. 安全呼び出しとElvis
  3. let、also、スコープ関数
  4. NullPointerExceptionを防ぐ
← Android Academyに戻る