この記事は、「イエソド アウトプット筋 トレーニング Advent Calendar 2020」20日目の記事です。
こんにちは。株式会社イエソドの@tbashiyyです。
書くネタが早速なくなってきて辛いのですが、Kotlinの Collection Builders が好きなことを思い出したので、それについて簡単に書きます。
もう一年弱前のリリースでしたが、1.3.70 で登場した機能です。(当時登場したときになぜかとっても感動しました、なんでだろう)
具体的には、 buildList buildMap buildSet の3つを指します。
これらが何をしてくれるかというと、Collectionの中身を操作している間は mutable に扱うことができ、完成したら immutable なCollectionになってくれます。
具体例として、いくつかのString型のデータが入っているimmutableなListを buildList を利用して生成してみます。
val list = buildList<String> {
add("hoge")
add("fuga")
}
println(list)
// ["hoge", "fuga"]
list.add("foo")
// Unresolved reference: add
ここで、 list は buildList のブロックの中では mutableList と同じ振る舞いをしてくれますが、listが生成した後に、 list.add("foo") のような操作をすることができません。
同じようなものを buildList を使わずに書こうとすると、
val mutableList = mutableListOf<String>()
mutableList.add("hoge")
mutableList.add("fuga")
val list = mutableList.toList()
のように、mutableListでitemを追加した後に、 toList() で immutable に変更しなければなりません。
上記のような、シンプルな場合はそもそも宣言時にitemを追加してしまえばいいのですが、実際の開発をしていると、何かしらの操作やループを回しながら Collectionを作成する場合もあるかと思います。
そういったときに、上記例で宣言した mutableList のような変数を作成し、残ってしまうと、思わぬ箇所からの操作で、バグが発生することもあるため、範囲を絞ってmutableな操作が可能になるので大変便利です。
個人的には、mutable collectionをできるだけ使いたくないので、 Collection Builders を重宝してます。