データクラスとタプル (Android Kotlin)

/






データクラス


classを構造体のデータ管理するために使いたい場合に、次のようにプロパティだけもたせたクラスを作ることがあるだろう。



このようなクラスは、修飾子dataをつけることで大変良いことが起こる。



自動で次のようなメソッドを実装してくれるのだ。

* equals()
* hashCode()
* toString()
* copy()
* componentN()


分解宣言


例えば、componentN()のメソッドが実装されたおかげで、次のように一度に変数をマッピングして取り出せる。



これを 分解宣言(destructuring declaration) と呼ぶ。

もし、修飾子dataをつけなかったら、自前でcomponentNを実装しなければならない。




Triple


ところで、KotlinにはSwiftやPythonのような可変可能なタプルは存在しない。しかし内容が限定されたPairやTripleといったクラスが用意されている。例えばTripleはこんな感じ。



データクラスで行った分解宣言と似ていないだろうか?

それもそのはず、PairやTripleもデータクラスなのだ!


Tripleの定義をみると次のようになっている。



修飾子out は、ジェネリック関数の型投影で共変を意味する。これによって、様々な任意の型の値を引数に渡せるようになるのだ。


Quadruple


Kotlin標準関数であるTripleの定義を真似て、Quadruple (クオドルプル)を作ってみよう。



Tripleの定義にプロパティquad を追加しただけで、とても簡単にQuadrupleが出来上がった。

それでは、実行してみよう。




実行してみると次のように出力された。

Quadruple data is (5, 汐華初流乃, しおばなはるの, ゴールド・エクスペリエンス)
[5, 汐華初流乃, しおばなはるの, ゴールド・エクスペリエンス]


1行目は、toString()をオーバーライドしているので期待通りの結果だ。

2行目は、listの中身が表示されている。今回、Quadrupleの値がInt型とString型の複数を持っているため、toListメソッドで返されるListはList<Any>型になっているので注意だ。


Pair


最後に、Pair型も使ってみよう。List<Pair>型のようなリストをfor文で回すと、次のように値を取りだせる。すでに分解宣言を知っているので、まったく不思議ではない。



ところで、Pair型のオブジェクトを作るときは次のように書くことができる。



これはMap型のオブジェクトを作るときにやっていることだ。

だから当然、Map型もPair型と同じようにfor文でkeyとvalueをマッピングできるわけだ。




参考


Basic Syntax (Kotlin Reference)
Idioms (Kotlin Reference)




関連記事


非同期 & ネットワーク処理
* はじめてRetrofitを使ってみる (Android Kotlin)
* 非同期処理でCoroutine(コルーチン)を使ってみる (Android Kotlin)
* OkHttpでHTTP通信 (Android Kotlin)
* スレッド処理 (Android Kotlin)

View & レイアウト
* リサイクラービューを使ってリスト表示 (Android Kotlin)
* 角丸表現 (Android Kotlin)
* onSaveInstanceStateで画面回転時の状態の保存と復元 (Android Kotlin)
* ListViewを簡単なモデルで理解しよう (Android Kotlin)
* バネアニメーション (Android Kotlin)
* startActivityForResultを使ってみる (Android Kotlin)
* ActivityとFragmentの連携を理解する (Android Kotlin)
* DataBinding機能を使ってみる (Android Kotlin)
* タッチイベントのフック (Android Kotlin)
* DialogFragmentを使ったダイアログの表示 (Android Kotlin)

サウンド
* これってSoundPoolのバグ?(Android Kotlin)
* SoundPoolを使ってゲームの効果音を再生する (Android Kotlin)

データ & オブジェクト
* Kotlinでオブジェクト(object)の動作確認
*
データクラスとタプル (Android Kotlin)
* Null安全、ぬるぽバイバイ (Android Kotlin)