この記事は、「イエソド アウトプット筋 トレーニング 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
を重宝してます。