※この記事は、Kotlin1.0.0を元に書かれています
ゆのうえです。 KotlinのMutableListは要素の追加・削除を行うことができますが、Listクラスを継承しておりforEachなどのループ関数も使えます。 「え…そんなことしちゃって大丈夫? ま、まさか、ループを回すときImmutableな配列オブジェクトを生成して回してくれている…!?」などと妄想しました。
実装を見ればすぐ分かることですが。
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }
…Iterableの実装そのままです。 なので、次のようなコードは例外が発生します。
val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) list.forEach { if (it == 5) list.remove(it) }
ちゃんと別オブジェクトを生成すれば大丈夫。
val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) list.toList().forEach { if (it == 5) list.remove(it) }
MutableMapなども同じです。明示的にMutableと宣言する以上そういうものだということでしょうか。
Javaコードと混在するプロジェクトの場合などで意図せずMutableListを使う機会があるかもしれませんが、ループ処理の際はJavaのArrayList同様に注意が必要です。
ちなみにmutableListOfで生成されるオブジェクトの実体はArrayListです。MutableListはKotlinでArrayListを扱うためのinterfaceとして存在する、という認識でよさそうです。