JetBrainsがKotlin1.7.0-Betaをリリースした。ビルダ推論(builder inference)と絶対非null型(definitely non-nullable type)がデフォルトで有効になり、 min()
、max()
、minBy()
、maxBy()
、minWidth()
、maxWith()
各関数が再導入されている。正規表現では、Kotlin/JSとKotlin/Nativeで名前付きキャプチャグループ(named capturing group)がサポートされた他、指定位置での完全一致に関するチェックが可能になった。
バージョン1.7.0で始まった"Milestone"リリースは、一般的なソフトウエアリリースのライフサイクル用語に合わせて、現在は"Beta"リリースと呼ばれている。ここでの"Beta"とは、新たな機能追加は行わず、コミュニティからのフィードバックを支援とする機能の安定化に重点が置かれる、という意味である。バージョン1.7.0-Betaの新機能を利用するには、Early Access Previewからビルドスクリプトを設定すればよい。
Kotlin 1.4のリリース以降、min()
およびmax()
コレクション関数は、コレクションが空の場合にnull
を返すことから、minOrNull()
およびmaxOrNull()
という名称に変更されていた。同等の機能であるminBy()
、maxBy()
、minWidth()
、maxWidth()
も同じく、関数名の最後にOrNull()
を含むように名称が変えられた。今回の最新リリースでは、min()
、max()
、minBy()
、maxBy()
、minWidth()
、maxWith()
関数が復活し、コレクションの要素を返すか、あるいは例外をスローするようになっている。
fun main() {
val intList = listOf<Int>()
// The following statement prints null
println(intList.minOrNull())
// The following statement prints
// "Exception in… Collection is empty."
println(intList.min())
}
ビルダ推論は、明示的な型引数を必要とせずに、コンパイラが渡されたラムダ内の呼び出しに基づいて型引数を推論できるようにする、型推論の一形式である。
val answerMap = buildMap {
put("The answer to life, the universe, and everything", 42)
}
ビルダ推論の実装はKotlin 1.5.30で初めて導入されたが、今回のリリースでは、デフォルトである通常の型推論では型に関する十分な情報を取得できない場合に、バージョン1.6ではコンパイラフラグとして導入されていたビルダ推論へのフォールバックが有効になっている。これにより、アノテーションやコンパイラフラグを必要とせずに、型推論を使用するカスタムビルダの記述が可能になる。
Kotlin 1.7.0では、Kotlin 1.6.20で導入された、絶対非null型のサポートが自動的に有効になっている。例えばJavaメソッドを@NotNull
引数でオーバーライドした場合には、T & Any
という構文を使って、ジェネリック型引数が絶対非nullであるとマークできる。
// Java method:
@NotNull
public T calculate(@NotNull T x) {}
// Kotlin method:
override fun calculate(x: T1 & Any): T1 & Any
Kotlin 1.5.30で導入されたRegex.matchAt()
とRegex.matchesAt()
が"Stable"になり、正規表現がString
あるいはCharSequence
の特定の位置にマッチすることの検証に使用できるようになった。
myRegex.matchesAt(text, 42) // returns true or false
myRegex.matchAt(text, 42) // returns the match or null
名前付きキャプチャグループが、正規表現内で"(?<name>group)
"という構文を使うことにより、Kotlin/JVM、Kotlin/JS、Kotlin/Nativeでサポートされるようになった。グループ名を指定して、そのグループにマッチしたテキストを取得するには、新しい関数MatchGroupCollection.get()
を使用する。
val regex = "(?<movie>[A-Za-z\\s]+):(?<year>[0-9]{4})".toRegex()
val movie = "The Fellowship of the Ring:2001"
val match = regex.find(movie)!!
// The following statement prints The Fellowship of the Ring
println(match.groups["movie"]?.value)
// The following statements print 2001
println(match.groups["year"]?.value)
println(match.groups[2]?.value)
"\k<name>
"という構文を使って、キャプチャグループと同じテキストにマッチするグループを逆参照する場合にも、グループ名を使用することができる。さらに名前付きグループは、replace()
やreplaceFirst()
といった関数のような置換式と合わせて使用することも可能だ。この場合、置き換え文字列内の${name}
オカレンスが、同じ名前のキャプチャグループで置き換えられる。
val regex = "(?<movie>[A-Za-z\\s]+):(?<year>[0-9]{4})".toRegex()
val movie = "The Fellowship of the Ring:2001"
// The following statement prints 2001-The Fellowship of the Ring
println(regex.replace(movie, "\${year}-\${movie}"))
新しいKotlin/Native Memoryマネージャがアルファ版として公開された。パフォーマンスと開発者エクスペリエンスが改善されている。新しいメモリマネージャは、AndroidとiOSのようなクロスプラットフォームアプリケーションの開発において、JVMプラットフォームとNativeプラットフォームの差異を取り除くことにより、開発者エクスペリエンスをより容易なものにする。このソリューションは、将来のリリースではデフォルトオプションになる予定である。テストは移行手順に従うことで可能だ。
Kotlin Blogには今回リリース全体が概説されている。また、テスト中に発生した問題は、YouTrackで報告が可能だ。