言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. 分割宣言

分割宣言

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

構文

// 基本的な分割宣言
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()』の数を超えられません。超えるとコンパイルエラーになります。

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