KotlinのListにaddメソッドが存在しないので困った経験は無いですか?
この記事では、KotlinのListにaddメソッドが無い理由と、その解決策について記載しています。
実はこの問題は、JavaからKotlinに移行した人にこそハマりやすい問題かも知れません。
JavaとKotlinのList の明確な違いについて、しっかりと理解して行きましょう!
結論
Kotlinの List型は、Immutable(不変の) List であり、コレクションの要素を追加や削除することはできません。
代わりに、Mutable(可変の) List を使用する必要があります。
解決方法
リストの生成方法をlistOf
からmutableListOf
に変更します。
listOf() -> mutableListOf()
具体例
以下、具体的なサンプルコードを元に説明します。
fun listExample() {
val immutableList = listOf(1, 2, 3)
val mutableList = mutableListOf(1, 2, 3)
val arrayList = arrayListOf(1, 2, 3)
immutableList.add(4) // NG(コンパイルエラー)
mutableList.add(4) // OK
arrayList.add(4) // OK
}
listOf
関数で作成されるリストは List<T>型であり、これは公式ドキュメント(List)にもある通り Read-onlyのImmutableなリストになります。
対して、mutableListOf
関数で作成されるリストは MutableList<T>型で、公式ドキュメント(MutableList)にもある通り、Read/Writeが可能なリストになります。
ちなみに、arrayListOf
関数で作成されるリストはArrayList<T>型で、ArrayListはMutableListを実装しているので、Read/Writeが可能です。
plusメソッドについて
List型にplus
というメソッド(正確には Collection<T>の拡張関数)があって、これを使って要素を追加することも出来ますがオススメしません。
fun listExample2() {
val immutableList = listOf(1, 2, 3)
val newImmutableList = immutableList.plus(4) // OK
}
plus
の中の処理を見ると分かりますが、新しくArrayListのインスタンスを生成して元のリスト要素と追加要素を連結したものを返す処理になっているので、非常に処理効率が悪いです。
一度だけ呼び出すならまだしも、何度も plus
を呼び出す様な処理を書くのは止めましょう。
何回も要素を追加する必要がある場合、素直にMutableListを使うべきです。
まとめ
最後に、この記事の内容をまとめます。
要点
- listOfで生成されるインスタンスは Immutable (不変) なので、add / remove 出来ない
- mutableListOfでリストを生成することで add / remove が可能になる
- 効率が悪いので plus を使うことはなるべく避けよう
今回は、Kotlinで起こりがちな勘違い 「Listにaddができない」について解説しました。
JavaのListとは動きが違うので、戸惑った部分もあるかも知れません。
しかし、KotlinのListはJavaに比べて大きく改善されており、慣れれば非常に安全で使いやすいものです。
今回の記事を参考に、ぜひマスターしてみて下さいね!
それではまた、他の記事でお会いしましょう!