データクラスとタプル【Android・Kotlin】

データクラス

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

class Kami(val level:Int, val kanji: String, val kana:String)

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

data class Kami(
    val level:Int = 20,
    val kanji: String = "天照大神",
    val kana:String = "アマテラスオオミカミ"
)

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

  • equals()
  • hashCode()
  • toString()
  • copy()
  • componentN()

分解宣言

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

val defaultKami = Kami()
val (level, name, kana) = defaultKami
println("$level, $name, $kana")

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

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

class Kami(
    val level:Int = 20,
    val kanji: String = "天照大神",
    val kana:String = "アマテラスオオミカミ"
) {
    operator fun component1(): Int = level
    operator fun component2(): String = kanji
    operator fun component3(): String = kana
}

Triple

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

val (id, name, furigana) = Triple(5, "汐華初流乃", "しおばなはるの")
println("$id, $name, $furigana")

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

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

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

public data class Triple<out A, out B, out C>(
    public val first: A,
    public val second: B,
    public val third: C
) : Serializable {
    public override fun toString(): String = "($first, $second, $third)"
}

public fun <T> Triple<T, T, T>.toList(): List<T> = listOf(first, second, third)

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

Quadruple

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

internal typealias Serializable = java.io.Serializable

public data class Quadruple<out A, out B, out C, out D>(
    public val first: A,
    public val second: B,
    public val third: C,
    public val quad: D
) : Serializable {
    public override fun toString(): String = "Quadruple data is ($first, $second, $third, $quad)"
}

public fun <T> Quadruple<T, T, T, T>.toList(): List<T> = listOf(first, second, third, quad)

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

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

fun main() {
    val hero = Quadruple(5, "汐華初流乃", "しおばなはるの", "ゴールド・エクスペリエンス")
    println(hero)

    val list = hero.toList()
    println(list)
}

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

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

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

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

Pair

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

val fruits = listOf<Pair<String, Int>>(
    Pair("バナナ", 100),
    Pair("りんご", 198)
)

for ((name, cost) in fruits) {
    println("果物: $name, 値段: $cost")
}

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

val pair:Pair<String, Int> = "A" to 1

これはMap型のオブジェクトを作るときにやっていることだ。だから当然、Map型もPair型と同じようにfor文でkeyとvalueをマッピングできるわけだ。

val capitals = mapOf<String, String>(
    "日本" to "東京", 
    "アメリカ合衆国" to "ワシントンD.C."
)

for ((k, v) in capitals) {
    println("国: $k, 首都: $v")
}

デスクワークの負担を減らすアイテム

作業効率をアップさせるには姿勢が大事です!実際に使ってみてどれもオススメなのでよかったら参考に!

Bestandノートパソコンスタンド 11 '' -16 '' Macbook Air Pro/富士通と互換性のある放熱性に優れたアルミニウム合金PCスタンド-シルバー
Bestandノートパソコンスタンド 11 '' -16 '' Macbook Air Pro/富士通と互換性のある放熱性に優れたアルミニウム合金PCスタンド-シルバー

ノートパソコンの高さをあげると、長時間のデスクワークでも作業者の負担を軽減する事が可能です。 アルミニウム製品、純正品、高品質、高級感があ ります。 対応機種:MacBook、MacBook Air、MacBook Pro、富士通と対応11"-16"ノートパソコン スタンド.

Amazon
AKRacing ゲーミングチェア Pro-X V2 GREY
AKRacing ゲーミングチェア Pro-X V2 GREY

AKRacingハイエンドゲーミングチェア。大きめの座面でゆったりとした座り心地。張地を経年劣化に強い高耐久仕様のPUレザーに変更したアップグレードモデル 寸法:背もたれ幅55cm/奥行55cm/高さ95cm、座面下高さ:32~39cm、座面厚さ:13cm、重量:25kg

Amazon
Kensington ExpertMouse ワイヤレストラックボール K72359JP
Kensington ExpertMouse ワイヤレストラックボール K72359JP

接続方式/Bluetooth、2.4GHz USB付属品/レシーバー、パームレスト、日本語取扱説明書 サイズ(本体):W130×D157×H65mm 対応OS:2.4GHzUSB:Windows10/8.1/8/7、MacOS10.8以降/Bluetooth4.0LE:Windows10/8.1、MacOS10.8以降

AmazonRakuten

Anrdoidアプリ開発にオススメの書籍

こちらの本は、図や絵が多くてわかりやすく、Androidアプリ開発初心者でも理解しやすい内容。基本的なことはしっかりおさえられるので、この手の本は一冊読んでおくと良と思う。

基本からしっかり身につくAndroidアプリ開発入門
基本からしっかり身につくAndroidアプリ開発入門

圧倒的な多数のユーザーが使っているヤフーのアプリ。その制作の最前線にいる黒帯エンジニアが、ユーザーが使いやすいアプリの大切な基本をしっかりと解説します。

KindleAmazonRakuten

Kotlinの実践的な使い方が学べる内容の本で、プログラミング技術をもっと磨きたい人向け。センスの良いプログラミングがたくさん紹介されていて、個人的には「目からうろこ」の連続だった本。

Kotlinプログラミング
Kotlinプログラミング

Kotlinは、Javaとの相互運用を可能にし、Android OSでGoogleがフルサポートする静的型プログラミング言語です。この言語は、Javaだけでは十全ではない(Javaだけでは実装に手間がかかりすぎる)、軽量かつ豊かな表現形式や、他言語ではすでに実装されている最新の機能を盛り込んでいます。

KindleAmazonRakuten

参考

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/