반응형
코틀린 구현을 보면서 숫자형, Comparable 구현체에 대한 최댓값, 최솟값을 강제할 수 있는 함수가 있어 소개합니다.
아래 소스는 _Ranges.kt 소스 코드에서 일부 발췌하였습니다.
public fun <T : Comparable<T>> T.coerceAtLeast(minimumValue: T): T {
return if (this < minimumValue) minimumValue else this
}
public fun Int.coerceAtLeast(minimumValue: Int): Int {
return if (this < minimumValue) minimumValue else this
}
...
public fun <T : Comparable<T>> T.coerceAtMost(maximumValue: T): T {
return if (this > maximumValue) maximumValue else this
}
public fun Int.coerceAtMost(maximumValue: Int): Int {
return if (this > maximumValue) maximumValue else this
}
...
public fun <T : Comparable<T>> T.coerceIn(minimumValue: T?, maximumValue: T?): T {
if (minimumValue !== null && maximumValue !== null) {
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
}
else {
if (minimumValue !== null && this < minimumValue) return minimumValue
if (maximumValue !== null && this > maximumValue) return maximumValue
}
return this
}
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
}
...
확장 함수(extension function)이므로 아래와 같이 if 문을 사용했던 구문을 쉽게 치환할 수 있습니다. 또한 메소드 체이닝(method chaining) 하기도 쉽겠죠?
// 최솟값 강제
val num: Int = ......
val num2: Int = if (num < 0) 0 else num
val num: Int = ......
val num2: Int = num.coerceAtLeast(0)
// 최댓값 강제
val num: Int = ......
val num2: Int = if (num > 1_000) 1_000 else num
val num: Int = ......
val num2: Int = num.coerceAtMost(1_000)
반응형