Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

分割宣言

オブジェクトの複数のプロパティを一度に複数の変数へ分解して代入する『分割宣言』の仕組みです。

構文
// 基本的な分割宣言
val (変数1, 変数2) = オブジェクト

// for ループ内での分割宣言
for ((変数1, 変数2) in コレクション) { }

// 不要な要素はアンダースコアで省略
val (変数1, _, 変数3) = オブジェクト
構文一覧
構文概要
val (a, b) = ペア『Pair』や『data class』を複数の変数に分解します。
componentN()分割宣言を実現する内部的な関数です。data class は自動生成されます。
val (k, v) = map.entriesマップのエントリを分割してループ処理します。
val (_, b) = ペアアンダースコアで不要な要素をスキップします。
サンプルコード
// data class は自動的に componentN() 関数を持ちます。
data class Point(val x: Int, val y: Int)
data class Person(val name: String, val age: Int, val city: String)

fun minMax(list: List<Int>): Pair<Int, Int> {
    return Pair(list.min(), list.max())
}

fun main() {
    // data class の分割宣言
    val point = Point(10, 20)
    val (x, y) = point
    println("x=$x, y=$y") // x=10, y=20

    // 不要な要素をスキップします。
    val person = Person("田中", 30, "東京")
    val (name, _, city) = person
    println("$name は $city 在住") // 田中 は 東京 在住

    // 関数の戻り値を分割します。
    val numbers = listOf(3, 1, 4, 1, 5, 9, 2)
    val (min, max) = minMax(numbers)
    println("最小=$min, 最大=$max") // 最小=1, 最大=9

    // マップのエントリをループで分割します。
    val scores = mapOf("Alice" to 90, "Bob" to 75)
    for ((name2, score) in scores) {
        println("$name2: $score 点")
    }
}
概要

分割宣言は内部的に『component1()』『component2()』といった関数を順番に呼び出しています。『data class』はこれらの関数を自動生成しますが、通常のクラスでは自分で定義する必要があります。

『Pair』や『Triple』も分割宣言に対応しているため、複数の値を返す関数と組み合わせると便利です。分割宣言の変数の数はオブジェクトの『componentN()』の数を超えられません。超えるとコンパイルエラーになります。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。