算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

#Kotlin マイルストーン3 予告!多重宣言とデータクラス

久々にKotlin公式ブログの更新がありました!

How do you traverse a map? | Project Kotlin

まもなく発表されるマイルストーン3 (M3) で導入される新機能の一部が紹介されています。その新機能は多重宣言 (Multi-declarations)データクラスです。この両機能は現行のタプルに取って代わる機能です。

多重宣言

多重宣言をよく使うことになるであろうシーンは、キーバリューペアのイテレートです。

for((key, value) in map) {
    println("$key : $value")
}

Map型の変数mapに対して繰り返し、要素を取り出しています。取り出される要素はキーとバリューの2つですが、それらを受け取る変数が2つ用意されています。変数keyと変数valueです。
これがKotlinの多重宣言です。

この多重宣言を可能にしている仕組みは、複数の値を返す機能をもった型です。先の例ではMap型ですね。
多重宣言機能により複数の値を返すには、関数 component*()を提供する必要があります。*の部分は任意の整数です(上限はあるのかな?)。
例えば次のようなクラスは、多重宣言に対応した型と言えます。

class Person(val name : String, val age : Int) {
    
    fun component1() = name
    fun component2() = age
}

関数 component*()は、拡張関数として定義しても問題ありません。

データクラス

OOPを行う上で、プロパティのみを持ち、特別な操作(メソッド等)がないクラスがしばしば必要になります。そのような場合Javaでは、退屈なコードを何十行も書く必要がありました(フィールドやアクセサメソッド等)。
Kotlinでは簡単にそのようなクラスを記述できます。次のクラスはnameとageというプロパティとコンストラクタのみを持ったクラス定義です。

class Person(val nage : String, val age : Int)

簡単ですね。
そして、さらにデータクラスを簡単に定義できるdataアノテーションが追加されました。このdataアノテーションを付けたクラスには、自動的に関数 component*()が生成されます。コンストラクタで宣言したプロパティの順に component*()が生成されます。

data class Person(val name : String, val age : Int)

fun main(args : Array<String>) {
    val persons = LinkedList<Person>()
    persons.add(Person("hoge", 20))
    persons.add(Person("fuga", 30))
    persons.add(Person("piyo", 40))

    for ((name, age) in persons) {
        println("$name is $age years old.")
    }
}

このコードを実行すると、次のように出力されます。

hoge is 20 years old.
fuga is 30 years old.
piyo is 40 years old.

現時点ではまだ実装されていませんが、今後はcomponent*()の他にtoString()equals()等もdataアノテーションにより自動生成されるらしいです。
M3からタプル機能は削除されますが、関数から複数の値を返したいときにはデータクラスを使用することになります。