fkm blog

software開発に関することを書いていきます

Kotlin Standard Libraryを読む(3)

kotlin.Int には拡張関数も生えてる。

coerceAtLeast

引数で指定した値よりは大きくなる。コード読んだほうが早い。

public fun Int.coerceAtLeast(minimumValue: Int): Int {
    return if (this < minimumValue) minimumValue else this
}

たとえば「HPを減らすが、マイナスになるときは0にしたい」といった時に使える?

var hp = 10
// 30のダメージをうけた!
hp = (hp - 30).coerceAtLeast(0)
print(hp)
=> 0

coerceAtMost

coerceAtLeastの逆。最大でも引数で指定した値で抑えられる。

public fun Int.coerceAtMost(maximumValue: Int): Int {
    return if (this > maximumValue) maximumValue else this
}

Red成分に足し算したいが、255を超えると困るというような場面で使えそう。

var red = 200
red = (red + 100).coerceAtMost(255)
print(red)
=> 255

coerceIn

範囲を指定して、範囲内だったらそのまま、範囲外だったら近いとこに補正する。

public fun Int.coerceIn(minimumValue: Int, maximumValue: Int): Int {
    if (minimumValue > maximumValue) throw IllegalArgumentException("Cannot coerce value to an empty range: maximum $maximumValue is less than minimum $minimumValue.")
    if (this < minimumValue) return minimumValue
    if (this > maximumValue) return maximumValue
    return this
}

こんな感じ

10.coerceIn(15, 45)
=> 15
20.coerceIn(15, 45)
=> 20
50.coerceIn(15, 45)
=> 45

余談だが、負の数を表す-は優先順位が低いので、-10.coerceIn(15, 45)-(10.coerceIn(15, 45)) として計算される。-10と15〜45で調べる場合は、 (-10).coerceIn(15, 45) のように () をつける。

rangeTo / until / downTo

どれもレンジを作る拡張関数。 untildownToinfix がついてるけど、 rangeTo にはついてないので注意。

0.rangeTo(3).forEach { println(it) }
=>
0
1
2
3
(0 until 3).forEach { println(it) }
=>
0
1
2
(3 downTo 0).forEach { println(it) }
=>
3
2
1
0