この記事は、「イエソド アウトプット筋 トレーニング Advent Calendar 2020」20日目の記事です。

こんにちは。株式会社イエソドの@tbashiyyです。

書くネタが早速なくなってきて辛いのですが、Kotlinの Collection Builders が好きなことを思い出したので、それについて簡単に書きます。

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

ここで、 listbuildList のブロックの中では 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 を重宝してます。