wrongwrongな開発日記

しんまいさんの忘備録

【Kotlin】通常ではfor文で回せないものをfor文っぽく扱う

Kotlinでは、浮動少数やBigIntegerなどはそのままだとfor文に入れて回すことができません。
こういったものはgenerateSequenceを使ってシーケンスにすることで、for文のように回すことができます。

やり方

以下はgenerateSequenceを使って階乗を実装したものです。
generateSequence{ }内の処理が値の更新と終了条件の判定です。takeIf { }内が終了条件です。

fun fact(n: BigInteger): BigInteger{
    var i = n
    var ans = BigInteger.ONE
    generateSequence { (i--).takeIf { i > BigInteger.ZERO } }.forEach {
        ans *= it
    }
    return ans
}

注釈

あくまで「のように」であって、sequence関連は奥深く、多くの使い道があります。
qiita.com