💭
Kotlin 1.7.0-Betaを試してみた
ポスト
少し出遅れましたが,上記ブログポストからサーバサイドKotlin使いとして気になる部分をピックアップして実際に動かしてみました.
1.7.0-Betaの導入
IntelliJの場合はキャプチャの箇所をEarly Access Preview
とすることで1.7.0-Betaが使えるようになります。
gradle設定
build.gradle.kts
plugins {
kotlin("jvm") version "1.7.0-Beta"
}
これで準備は完了です。
preview内容の確認
Changes to builder inference
The return of the min() and max() collection functions
以前max
関数を実態に合わせてmaxOrNull
関数にリネームしたが max
関数を空コレクションの場合は例外を送出する関数として再導入した模様です。
fun main(args: Array<String>) {
listOf<Int>().maxOrNull() // null
listOf<Int>().max() // exception
}
Stabilizing of definitely non-nullable types
1.6.20から試験導入されていたジェネリクスの上限境界のnon-null指定の専用記述がstableになった模様です。
kotlinで普通にジェネリクスを用意すると型パラメータの上限境界はAny?
型となりnullが指定可能です。
それをこれまでは上限境界の型としてAny
を明示的に指定して防ぐ必要がありました。
※Javaで定義されたジェネリクスをKotlinで拡張時にNonNullで定義する際のスマートな書き方無いのって?ってこから出てきたみたいなんですが具体的にどんなケースを解消したかったのか後でもう少しISSUEを見てみたいと思います
fun main(args: Array<String>) {
val nullable = NullableBox(null)
val oldNonNullable = OldNonNullBox(null) // コンパイルエラー
val newNonNullable = NewNonNullBox(null) // コンパイルエラー
}
class NullableBox<T>(val contents: T)
class OldNonNullBox<T: Any>(val contents: T)
class NewNonNullBox<T>(val contents: T & Any)
Matching with Regex at a particular position
Regex
クラスに1.5.3から導入された以下2関数がstableになった模様です。
-
matchesAt()
正規表現にマッチする開始indexを指定することで、一致することかつ想定箇所で一致することを一度に検証可能です。
val targets = "080-0800-1111"
val regex = "[0|8]+".toRegex()
println(regex.matchesAt(targets, 0)) // true
println(regex.matchesAt(targets, 4)) // true
println(regex.matchesAt(targets, 8)) // false
-
matchAt()
検証としてはmatchesAt
と同様ですが、検証結果がマッチした場合にはマッチ結果となり、マッチしなかった場合はnull
が返る関数の模様です。
val targets = "080-0800-1111"
val regex = "[0|8]+".toRegex()
println(regex.matchAt(targets, 0)?.value) // 080
println(regex.matchAt(targets, 8)) // null
Discussion