はじめに
前回は、はじめてのKotlinの文法:配列について学習しました。今回はKotlinの文法:コレクションついて説明していきます。以下は前回までの記事です。
第2章:Kotlinの文法
- 2.1 変数を参照してください。
- 2.2 関数を参照してください。
- 2.3 データ型を参照してください。
- 2.4 配列を参照してください。
KotlinはJavaとは異なり、イミュータブル(変更不可能:immutable)とミュータブル(変更可能:mutable)のインタフェースが明確に分かれています。
ミュータブル(変更可能:mutable)なコレクションは要素を変更したり、追加や削除が可能ですが、イミュータブル(変更不可能:immutable)なコレクションは追加や削除ができません。
KotlinにはJavaと同様にコレクション系オブジェクト(List、Set、Mapなど)があります。ただし、上述したようにリードオンリーでイミュータブルでアクセスするのか、ミュータブルで編集用にアクセスするのかによってインタフェースが使い分けられます。
具体的には、要素を参照するだけであれば、Kotlinではイミュータブル(変更不可能:immutable)なCollection インタフェースを使用し、要素の追加や削除が必要な場合は ミュータブル(変更可能:mutable)なMutableCollection インタフェースを使用します。
Kotlinでは、List、Set、Mapはイミュータブル(変更不可能:immutable)であるCollection インタフェースを実装しています。一方で、MutableList、MutableSet、MutableMapはミュータブル(変更可能:mutable)であるMutableCollectionインタフェースを実装しており、要素の編集が可能です。
- List、Set、Mapは読み取り専用。add等の更新系のメソッドは備えていない。
- Mutableが頭に着いたMutableList、MutableSet、MutableMapは編集可能。add等の更新系のメソッドを備えている。
クラス図が読み取れる方は、以下のような継承関係となっております。
全体的なインタフェースの関係は以下のようなクラス図となります。
■2.5.1 コレクションオブジェクト生成のための関数
コレクションオブジェクトには、インスタンスを生成するための、xxxOf() という形のユーティリティ関数が用意されています。
- List (immutable): listOf()・・・順序を持つコレクション。重複可
- MutableList (mutable): mutableListOf()
- ArrayList (mutable): arrayListOf()
- MutableList (mutable): mutableListOf()
- Set (immutable): setOf()・・・順序を持たないコレクション。重複不可
- MutableSet (mutable): mutableSetof()
- HashSet (mutable): hashSetOf()
- LinkedHashSet (mutable): linkedSetOf()
- SortedSet (mutable): sortedSetOf()
- MutableSet (mutable): mutableSetof()
- Map (immutable): mapOf()・・・キーバリューで値を保持するコレクション
- MutableMap (mutable): mutableMapOf()
- HashMap (mutable): hashMapOf()
- LinkedHashMap (mutable): linkedMapOf()
- SortedMap (mutable): sortedMapOf()
- MutableMap (mutable): mutableMapOf()
val immutablelist = listOf(1, 2, 3, 4, 5)
// 書き込みも可能
val mutablelist = mutableListOf(1, 2, 3, 4, 5)
nullを覗いたListを生成することもできます。
val notNullList = listOfNotNull(null, "a", "b", "c", null)
println(list) // [null, "a", "b", "c", null]を出力
println(notNullList) // ["a", "b", "c"]を出力
◆2.5.1.1 イミュータブル(変更不可能)なコレクション
val immutablelist = listOf(1, 2, 3, 4, 5)
immutablelist[0] = 10 // ERROR!! 変更できない。
// Map<Int, String> を作る。Mapは編集不可
val immutablelistMap = mapOf(1 to "A", 2 to "B")
immutablelistMap[0] = "hoge" // ERROR!! 変更できない
ただし、注意が必要なのは、Kotlinのイミュータブル(変更不可能)なコレクションは、読み取り専用ではありますが、完全な変更不可能なオブジェクトではありません。なぜなら、ミュータブル(変更可能)なコレクションは、上述したクラス図の関係で、イミュータブル(変更不可能)なコレクションを継承しているため、そのインスタンスはイミュータブル(変更不可能)なコレクションに代入できてしまいます。
val immutableList: List<Int> = mutableList // mutableを読み込み専用に代入
mutableList.add(4)
println(immutableList)
これには注意が必要です。
◆2.5.1.2 ミュータブル(変更可能)なコレクション
val mutablelist = mutableListOf(1, 2, 3, 4, 5)
mutablelist[0] = 5
val mutableMap = mutableMapOf(1 to "A", 2 to "B")
mutableMap[0] = "hoge"
■2.5.2 コレクションオブジェクトの変換
イミュータブル(変更不可能)なコレクションとミュータブル(変更可能)なコレクション間の変換には、toXXXメソッドを使用します。
val mutableList1 = mutableListOf(1, 2, 3)
val list1: List<Int> = mutableList1.toList()
// List => MutableList
val list2: List<Int> = listOf(1, 2, 3)
val mutableList2: MutableList<Int> = list2.toMutableList()
■2.5.3 Java コレクションのインスタンスの生成
Javaのコレクションのインスタンスを作る関数も用意されています。
val arrayList = arrayListOf(1, 2, 3)
// HashSetを生成
val hashSet = hashSetOf(1, 2, 3)
// HashMapを生成
val hashMap = hashMapOf(1 to 10, 2 to 20, 3 to 30)
javaコレクションとは相互変換が可能です。
- java.util.Iterable ⇔ kotlin.collections.Iterable
- java.util.Collection ⇔ kotlin.collections.Collection
- java.util.List ⇔ kotlin.collections.List
- java.util.Set ⇔ kotlin.collections.Set
- java.util.Map ⇔ kotlin.collections.Map
おわりに
如何でしょうか。Javaに慣れ親しんだ方はKotlinでは、イミュータブルとミュータブルがコレクションで区別されていることは注意が必要です。Kotlinではそのコレクションが変更可能なのかそうでないのかを実装時に意識することで、予期せぬバグを抑えることにもつながります。
次は制御構文について説明したいと思います。
お知らせ
アイデアひとつが3万円に!?発想をお金に変えることができるアプリ「SENSE β版」が7月11日よりリリースされましたので、早速使ってみました。こちらも読んでいただけましたら幸いです。
written by たみと@プロマリ