[Kotlin]coerceAtLeastって結局何するメソッドなの?

公式リファレンスでメソッドを調べているとよく目にするメソッドにcoerceAtLeastcoerceAtMostcoerceInといったメソッドがあります。

よく目にするということは割とありふれたメソッドのはず。でも正直これらが何に使うメソッドなのかよく分からない。今回はそんな存在感の薄いメソッドたちに焦点を当てていこうと思います。

coerce系メソッドの意味

「coerce」とは「強制する」「強要する」という意味の単語。(発音は「コース」が近いです)
これに「at least」(少なくとも)や「at most」(多くても)がくっついたのがこれらのメソッド名となります。

このことを踏まえた上で、APIリファレンスを確認していきましょう。

メソッドの実装と基本的な使い方

fun <T : Comparable<T>> T.coerceAtLeast(minimumValue: T): T
fun <T : Comparable<T>> T.coerceAtMost(maximumValue: T): T
fun <T : Comparable<T>> T.coerceIn(
    minimumValue: T?,
    maximumValue: T?
): T

coerce系のメソッドはComparableインターフェイスを実装したジェネリック型から呼び出せるメソッドです。

[Kotlin]はじめてのジェネリクス クラスや関数で使ってみよう!
ジェネリック(generic)とは「汎用的な」という意味の単語、ジェネリクス(g...

挙動を確認するために簡単な例をいくつか挙げていきます。

//1という数値を、少なくとも10以上になるよう強制する
1.coerceAtLeast(10)   //10

//呼び出し元が10以上であればそのまま
100.coerceAtLeast(10)  //100
//100を少なくとも0以下になるよう強制する
100.coerceAtMost(0)   //0

//負の値は()で囲む
(-9).coerceAtMost(0)   //-9
//呼び出し元を引数の範囲に収まる値に強制する
(-9).coerceIn(0, 10)  //0

//引数はRange型も可
100.coerceIn(0..10)  //10

数値型はどれもComparableを実装しています。こう見るとすごく単純明快ですね。

数値型以外で使う

数値以外では以下のような型から使用可能。

クラス名値の例
Booleantrue | false
Char‘a’ | ‘あ‘
Duration1.toDuration(TimeUnit.DAYS) == 24.0h
EnumDayOfWeek.FRIDAY
KotlinVersionKotlinVersion.CURRENT == 利用中のKotlinバージョン
String“abc”

例としてChar型でも使ってみましょう。

fun main() {
    val k = "Kotlin"
    k.forEach { println("${it}は${it.toByte()}番目の文字") }

    //String.max()やmin()の戻り値はnull許容型
    println(k.max()?.coerceAtMost('g'))
    println(k.min()?.coerceIn('a', 'r'))
}
/*
Kは75番目の文字
oは111番目の文字
tは116番目の文字
lは108番目の文字
iは105番目の文字
nは110番目の文字
K
a
*/

Char型は数値に変換することが可能であり、その集合体であるString型からはList<Int>と同じように、minmaxといったメソッドで最小/最大の値を取り出せます。(空文字列の場合はnullになるので、戻り値はnull許容型です)

[Kotlin]文字表記とString型メソッドのチートシート
今回はKotlinの文字や文字列に関する基礎知識を1ページにまとめます。コメント...
タイトルとURLをコピーしました