💭

Kotlin 1.7.0-Betaを試してみた

2022/05/20に公開

ポスト

https://blog.jetbrains.com/kotlin/2022/05/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になった模様です。

  1. 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
  1. 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