🐻‍❄️

Kotlin の buildList を使って List を生成する

2021/11/18に公開

Kotlin の buildList を使って List を生成する

builstList とは

Kotlin v1.6 では buildList というインライン関数がある。

@SinceKotlin("1.6")
@WasExperimental(ExperimentalStdlibApi::class)
@kotlin.internal.InlineOnly
public inline fun <E> buildList(@BuilderInference builderAction: MutableList<E>.() -> Unit): List<E> {
    contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) }
    return buildListInternal(builderAction)
}

buildList を利用すると以下のようにMutableList の関数を利用して Listを生成できる。

fun main() {
    val list : List<String> = buildList {
        add("1")
        add("2")
        add("3")
    }
}

buildList では capacity を設定できる

buildList には capacity を設定できるインライン関数も用意されている。

@SinceKotlin("1.6")
@WasExperimental(ExperimentalStdlibApi::class)
@kotlin.internal.InlineOnly
public inline fun <E> buildList(capacity: Int, @BuilderInference builderAction: MutableList<E>.() -> Unit): List<E> {
    contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) }
    return buildListInternal(capacity, builderAction)
}

buildList のコードを読んでみたところ、内部では Array を保持していて、Array の初期サイズを決めるのにcapacity が使われるらしい。

fun main() {
    val list : List<String> = buildList(capacity = 3) {
        add("1")
        add("2")
        add("3")
    }
}

あくまでも生成速度の最適化に使われるパラメータっぽいので capacity を超えて要素を追加しても特にエラーは発生しない。詳細は公式ドキュメントにも記載がなかったが巨大な List を作らない限りは capacity を設定する必要はなさそう。

参考文献

Discussion