Kotlinでmapの使い方がよくわからない
mapの種類がよくわからない
Kotlinでmapの使い方がそもそもよくわからなかったり、immutabilityについてよくわからず使いこなせないという方はいませんか?
こんにちは!エンジニアのかいです。Kotlinをこれから始めようとしている人、もしくは始めたての人であればプログラミングの基本であるmapについて悩んでいる人もいると思います。
そこで本日はKotlin初心者の方を対象にmapの使い方を基本的なところや、immutabilityについてなども詳しく解説していきます。
この記事はこんな人のために書きました。
- Kotlinでmapの基本的な使い方を知りたい
- mapの種類を理解して場面によってつかいわけたい
Kotlinのmapとは
さて、実際にmapの使い方を紹介していきたいところですが、中にはmapという概念についてよくわかっていない人もいると思うので簡単に説明しておきます。
Kotlinではmapと呼ばれていますが、他言語では、ハッシュや、辞書(ディクショナリ)と呼ばれています。これらは基本的にはKVS(Key Value Store)といってkeyとvalueを一つのセットにしてデータを管理しようというものです。
配列はindexと値をセットとしてデータを管理しますが、mapではそのindexがkeyにあたります。例えば{"name": "taro"}というKVSがあったら、基本的には"name"というkeyを指定して、"taro"というvalueを取り出します。
mapの種類を理解してよう
KVSはWebなどでも良く使われるのでmapについては少しプログラムを書いたことがある人ならだいたい分かっていただけたと思います。そこでKotlinのmapに焦点を戻していきましょう。
実はKotlinには大きく分けて2種類のmapがあります。その2つはimmutabilityという概念によって分けられていてこれはKotlinでは良く利用される概念なので理解しておきましょう。
immutabilityとは
immutabilityとは簡単に言えば、値が上書きできるか否かということです。
あれ、それはつまり定数か変数かということですか?という疑問も出ると思いますがそれは違います。
varかvalかということです。変数と定数、varとvalについて理解が浅い方はここで、ん?となる方もいると思うのでそれらの概念について説明しておきます。
まず大きい概念では、定数(const)と変数(variable)があります。そして変数の中に(var(mutable), val(immutable))があります。正確にはKotlinでは、定数(const)は変数の中のvalのなかにありますが、まあそこは今日は置いておきます。
そして、
const | 常に同じ値。何回呼び出しても同じ値 |
---|---|
variable | |
mutable | 実装によって値が変わる |
imuutable | 最初に代入された値から変化しない。呼び出しごとに値を変えることは可能 |
というのがそれぞれの定義です。
つまりvalというのはこういうことですね。
fun test(s: String){ val test = s println(test) } fun main() { test("hello") test("goodnight") }
hello goodnight
mutableなmap
さてimmutabilityについて分かったところで話を戻しましょう。mapにはmutableとimmutableがあるんでしたね。
mutableなmapはmutableMapOfという関数を利用して作成します。
immutableなmap
immutable、つまり読み取り専用なmapはmapOfという関数を利用します。
実際に使ってみよう
さて、説明はほどほどにして実際に使ってみましょう。まずは、mapの作り方です。
fun main() { val testmap = mapOf("name" to "taro") println(testmap) }
{name=taro}
まずはミニマムでみてみましょう。このようにkey to taroといった風に"to"を使って作成するのは最初は馴染みがあまりないかもしれませんが使っていればすぐ慣れます。
fun main() { val testmap = mapOf("name" to "taro", 2 to "yuko") println(testmap["name"]) println(testmap[2]) }
taro yuko
このように、keyの値を使ってvalueを呼び出せることがわかりますね。
fun main() { val testmap = mapOf("name" to "taro", 2 to "yuko") testmap["name"] = "yuji" }
また、先ほど説明した通りmapOfはreadOnlyなのでこのように値を変更することはできずコンパイルが通りません。次にmutableなmapについてもみていきます。
fun main() { val testmap = mutableMapOf("name" to "taro", 2 to "yuko") println(testmap["name"]) testmap["name"] = "yuji" println(testmap["name"]) }
taro yuji
このように、値が書き換えられていることがわかりますね。当然ですが、mutableMapOfの中身は変更することはできますが、testmap自体はvalなので上書きはできません。
fun main() { val testmap = mutableMapOf("name" to "taro", 2 to "yuko") println(testmap["name"]) testmap["name"] = "yuji" println(testmap["name"]) testmap = mapOf("name" to "yuji") }
このようなコンパルは通らないということですね。
まとめ
さて、immutabilityに着目してmapの基本的な2種類の使い方を説明してきました。正しくコーディングすることで効率が良くバグの少ないプログラムを作ることができるのでしっかり違いを理解してつかいこなしていきましょう!
それでは!!