Kotlin 1.5.0の新機能
Kotlin 1.5.0では、新しい言語機能、安定版のIRベースJVMコンパイラバックエンド、パフォーマンスの改善、および実験的機能の安定化や古い機能の非推奨化といった進化的な変更が導入されました。
変更点の概要は、リリースブログ記事でもご覧いただけます。
言語機能
Kotlin 1.5.0では、1.4.30でプレビューとして発表された新しい言語機能の安定版が提供されます。
これらの機能の詳細については、こちらのブログ記事とKotlinドキュメントの対応するページで確認できます。
JVMレコードのサポート
Javaは急速に進化しており、KotlinがJavaとの相互運用性を維持できるようにするため、最新機能の1つであるレコードクラスのサポートを導入しました。
KotlinのJVMレコードサポートには、双方向の相互運用性が含まれます。
- Kotlinコードでは、Javaのレコードクラスをプロパティを持つ通常のクラスと同じように使用できます。
- KotlinクラスをJavaコードでレコードとして使用するには、
data
クラスにして@JvmRecord
アノテーションを付けます。
@JvmRecord
data class User(val name: String, val age: Int)
シールドインターフェース
Kotlinのインターフェースはsealed
修飾子を持つことができるようになりました。これはクラスと同様にインターフェースに作用し、シールドインターフェースのすべての実装がコンパイル時に既知になります。
sealed interface Polygon
その事実を利用して、例えば網羅的なwhen
式を書くことができます。
fun draw(polygon: Polygon) = when (polygon) {
is Rectangle -> // ...
is Triangle -> // ...
// else is not needed - all possible implementations are covered
}
さらに、シールドインターフェースは、1つのクラスが複数のシールドインターフェースを直接継承できるため、より柔軟な制限されたクラス階層を可能にします。
class FilledRectangle: Polygon, Fillable
パッケージ全体にわたるシールドクラス階層
シールドクラスは、同じコンパイル単位および同じパッケージ内のすべてのファイルにサブクラスを持つことができるようになりました。以前は、すべてのサブクラスは同じファイル内に存在する必要がありました。
直接のサブクラスは、トップレベルであるか、任意の数の名前付きクラス、名前付きインターフェース、または名前付きオブジェクト内にネストされていても構いません。
シールドクラスのサブクラスは、適切に修飾された名前を持つ必要があります。ローカルオブジェクトや匿名オブジェクトにはできません。
インラインクラス
インラインクラスは、値のみを保持する値ベースクラスのサブセットです。これらは、メモリ割り当てによる追加のオーバーヘッドなしに、特定の型の値のラッパーとして使用できます。
インラインクラスは、クラス名の前にvalue
修飾子を付けて宣言できます。
value class Password(val s: String)
JVMバックエンドでは、特別な@JvmInline
アノテーションも必要です。
@JvmInline
value class Password(val s: String)
現在、inline
修飾子は警告とともに非推奨となっています。
Kotlin/JVM
Kotlin/JVMには、内部およびユーザー向けの改善が多数加えられました。特に注目すべき点を以下に示します。
- 安定版JVM IRバックエンド
- 新しいデフォルトのJVMターゲット: 1.8
- invokedynamic経由のSAMアダプター
- invokedynamic経由のラムダ
- @JvmDefault と古い Xjvm-default モードの非推奨化
- nullabilityアノテーションの処理の改善
安定版JVM IRバックエンド
Kotlin/JVMコンパイラのIRベースバックエンドが、Stableとなり、デフォルトで有効になりました。
Kotlin 1.4.0以降、IRベースのバックエンドの初期バージョンがプレビューとして利用可能でしたが、言語バージョン1.5
ではデフォルトになりました。古いバックエンドは、以前の言語バージョンでは引き続きデフォルトで使用されます。
IRバックエンドの利点とその将来の開発についての詳細は、こちらのブログ記事で確認できます。
Kotlin 1.5.0で古いバックエンドを使用する必要がある場合は、プロジェクトの設定ファイルに以下の行を追加できます。
- Gradleの場合:
tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile> {
kotlinOptions.useOldBackend = true
}
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile) {
kotlinOptions.useOldBackend = true
}
- Mavenの場合:
<configuration>
<args>
<arg>-Xuse-old-backend</arg>
</args>
</configuration>
新しいデフォルトのJVMターゲット: 1.8
Kotlin/JVMコンパイルのデフォルトターゲットバージョンが1.8
になりました。1.6
ターゲットは非推奨です。
JVM 1.6用のビルドが必要な場合でも、このターゲットに切り替えることができます。方法はこちらです。
invokedynamic経由のSAMアダプター
Kotlin 1.5.0では、SAM (Single Abstract Method) 変換のコンパイルに動的呼び出し (invokedynamic
) を使用するようになりました。
- SAM型がJavaインターフェースである場合、任意の式に対して
- SAM型がKotlin関数型インターフェースである場合、ラムダに対して
新しい実装ではLambdaMetafactory.metafactory()
を使用し、コンパイル中に補助的なラッパークラスが生成されなくなりました。これにより、アプリケーションのJARサイズが減少し、JVMの起動パフォーマンスが向上します。
匿名クラス生成に基づく古い実装方式に戻すには、コンパイラオプション-Xsam-conversions=class
を追加します。
Gradle、Maven、およびコマンドラインコンパイラでコンパイラオプションを追加する方法を学びます。
invokedynamic経由のラムダ
DANGER
invokedynamicへのプレーンなKotlinラムダのコンパイルは実験的です。これはいつでも廃止または変更される可能性があります。オプトインが必要であり(詳細は下記参照)、評価目的でのみ使用してください。これに関するフィードバックをYouTrackでお寄せいただければ幸いです。
Kotlin 1.5.0では、プレーンなKotlinラムダ(関数型インターフェースのインスタンスに変換されないもの)を動的呼び出し (invokedynamic
) にコンパイルする実験的なサポートを導入しています。この実装は、LambdaMetafactory.metafactory()
を使用することで、必要なクラスを実行時に効果的に生成し、より軽量なバイナリを生成します。現在、通常のラムダコンパイルと比較して3つの制限があります。
- invokedynamicにコンパイルされたラムダはシリアライズできません。
- そのようなラムダで
toString()
を呼び出すと、可読性の低い文字列表現が生成されます。 - 実験的な
reflect
APIは、LambdaMetafactory
で作成されたラムダをサポートしません。
この機能を試すには、-Xlambdas=indy
コンパイラオプションを追加してください。このYouTrackチケットを使用してフィードバックを共有していただけると幸いです。
Gradle、Maven、およびコマンドラインコンパイラでコンパイラオプションを追加する方法を学びます。
@JvmDefault と古い Xjvm-default モードの非推奨化
Kotlin 1.4.0より前は、-Xjvm-default=enable
および-Xjvm-default=compatibility
モードとともに@JvmDefault
アノテーションがありました。これらは、Kotlinインターフェース内の特定の非抽象メンバーに対してJVMデフォルトメソッドを作成するために使用されました。
Kotlin 1.4.0では、プロジェクト全体に対してデフォルトメソッドの生成をオンにする新しいXjvm-default
モードを導入しました。
Kotlin 1.5.0では、@JvmDefault
と古いXjvm-defaultモード (-Xjvm-default=enable
および-Xjvm-default=compatibility
) を非推奨化しています。
Java相互運用におけるデフォルトメソッドについて詳しく学ぶ。
nullabilityアノテーションの処理の改善
Kotlinは、nullabilityアノテーションを使用してJavaからの型nullability情報を処理することをサポートしています。Kotlin 1.5.0では、この機能に関していくつかの改善が導入されました。
- 依存関係として使用されるコンパイル済みJavaライブラリの型引数にあるnullabilityアノテーションを読み取ります。
TYPE_USE
ターゲットを持つnullabilityアノテーションをサポートします。- 配列
- 可変引数
- フィールド
- 型パラメータとその境界
- 基底クラスとインターフェースの型引数
- nullabilityアノテーションが型に適用可能な複数のターゲットを持ち、そのうちの1つが
TYPE_USE
である場合、TYPE_USE
が優先されます。例えば、@Nullable
がTYPE_USE
とMETHOD
の両方をターゲットとしてサポートしている場合、メソッドシグネチャ@Nullable String[] f()
はfun f(): Array<String?>!
になります。
これらの新しくサポートされたケースでは、KotlinからJavaを呼び出す際に誤った型nullabilityを使用すると警告が生成されます。これらのケース(エラーレポートを含む)で厳密モードを有効にするには、-Xtype-enhancement-improvements-strict-mode
コンパイラオプションを使用します。
Kotlin/Native
Kotlin/Nativeは、より高性能で安定したものになりました。主な変更点は以下のとおりです。
パフォーマンスの改善
1.5.0では、Kotlin/Nativeはコンパイルと実行の両方を高速化する一連のパフォーマンス改善を受けています。
コンパイラキャッシュが、linuxX64
(Linuxホストのみ) およびiosArm64
ターゲットのデバッグモードでサポートされるようになりました。コンパイラキャッシュを有効にすると、最初のコンパイルを除いて、ほとんどのデバッグコンパイルがはるかに高速に完了します。測定では、テストプロジェクトで約200%の速度向上が示されました。
新しいターゲットでコンパイラキャッシュを使用するには、プロジェクトのgradle.properties
に以下の行を追加してオプトインしてください。
linuxX64
の場合:kotlin.native.cacheKind.linuxX64=static
iosArm64
の場合:kotlin.native.cacheKind.iosArm64=static
コンパイラキャッシュを有効にした後に問題が発生した場合は、イシュートラッカーYouTrackまでご報告ください。
その他の改善により、Kotlin/Nativeコードの実行が高速化されます。
- 自明なプロパティアクセサーはインライン化されます。
- 文字列リテラルの
trimIndent()
はコンパイル中に評価されます。
メモリリークチェッカーの無効化
組み込みのKotlin/Nativeメモリリークチェッカーがデフォルトで無効になりました。
これは元々内部使用向けに設計されており、限られた数のケースでのみリークを検出でき、すべてを検出できるわけではありません。さらに、後にアプリケーションのクラッシュを引き起こす可能性のある問題があることが判明しました。そのため、メモリリークチェッカーをオフにすることにしました。
メモリリークチェッカーは、例えばユニットテストなど、特定のケースでは依然として役立ちます。これらのケースでは、以下のコード行を追加することで有効にできます。
Platform.isMemoryLeakCheckerActive = true
アプリケーションの実行時にチェッカーを有効にすることは推奨されません。
Kotlin/JS
Kotlin/JSは1.5.0で進化的な変更を受けています。私たちはJS IRコンパイラバックエンドの安定化に向けて作業を続けており、その他の更新も提供しています。
webpack 5へのアップグレード
Kotlin/JS Gradleプラグインは、webpack 4の代わりにwebpack 5をブラウザターゲットに使用するようになりました。これは互換性のない変更をもたらすwebpackのメジャーアップグレードです。カスタムwebpack設定を使用している場合は、必ずwebpack 5リリースノートを確認してください。
webpackを使用したKotlin/JSプロジェクトのバンドルについて詳しく学ぶ。
IRコンパイラ用のフレームワークとライブラリ
DANGER
Kotlin/JS IRコンパイラは現在アルファ版です。将来的に互換性のない変更があり、手動での移行が必要になる可能性があります。これに関するフィードバックをYouTrackでお寄せいただければ幸いです。
Kotlin/JSコンパイラ用のIRベースのバックエンドの開発と並行して、ライブラリの作者がプロジェクトをboth
モードでビルドすることを奨励し、支援しています。これにより、両方のKotlin/JSコンパイラ用のアーティファクトを生成できるようになり、新しいコンパイラのエコシステムが成長します。
多くの有名なフレームワークやライブラリは、すでにIRバックエンドで利用可能です。例: KVision、fritz2、doodleなど。プロジェクトでこれらを使用している場合、すでにIRバックエンドでビルドしてその利点を確認できます。
独自のライブラリを作成している場合は、「両方」モードでコンパイルしてください。そうすることで、クライアントも新しいコンパイラでそれを使用できるようになります。
Kotlin Multiplatform
Kotlin 1.5.0では、各プラットフォームのテスト依存関係の選択が簡素化され、Gradleプラグインによって自動的に行われるようになりました。
文字カテゴリを取得するための新しいAPIがマルチプラットフォームプロジェクトで利用可能になりました。
標準ライブラリ
標準ライブラリには、実験的機能の安定化から新機能の追加まで、さまざまな変更と改善が加えられました。
- 安定版の符号なし整数型
- テキストの大文字/小文字変換のための安定版ロケール非依存API
- 安定版の文字から整数への変換API
- 安定版Path API
- 切り捨て除算とmod演算子
- Duration APIの変更点
- 文字カテゴリを取得するための新しいAPIがマルチプラットフォームコードで利用可能に
- 新しいコレクション関数 firstNotNullOf()
- String?.toBoolean()の厳密版
標準ライブラリの変更点については、こちらのブログ記事で詳しく学ぶことができます。
安定版の符号なし整数型
符号なし整数型UInt
、ULong
、UByte
、UShort
はStableになりました。これらの型に対する操作、範囲、進行も同様です。符号なし配列とその操作はベータ版のままです。
テキストの大文字/小文字変換のための安定版ロケール非依存API
このリリースでは、テキストの大文字/小文字変換のための新しいロケール非依存APIが提供されます。これは、ロケールに依存するtoLowerCase()
、toUpperCase()
、capitalize()
、およびdecapitalize()
API関数の代替を提供します。新しいAPIは、異なるロケール設定によるエラーを回避するのに役立ちます。
Kotlin 1.5.0では、以下の完全にStableな代替機能が提供されます。
String
関数について:以前のバージョン 1.5.0の代替 String.toUpperCase()
String.uppercase()
String.toLowerCase()
String.lowercase()
String.capitalize()
String.replaceFirstChar { it.uppercase() }
String.decapitalize()
String.replaceFirstChar { it.lowercase() }
Char
関数について:以前のバージョン 1.5.0の代替 Char.toUpperCase()
Char.uppercaseChar(): Char
Char.uppercase(): String
Char.toLowerCase()
Char.lowercaseChar(): Char
Char.lowercase(): String
Char.toTitleCase()
Char.titlecaseChar(): Char
Char.titlecase(): String
NOTE
Kotlin/JVMには、明示的なLocale
パラメータを持つオーバーロードされたuppercase()
、lowercase()
、titlecase()
関数もあります。
古いAPI関数は非推奨としてマークされており、将来のリリースで削除されます。
テキスト処理関数の変更点の全リストは、KEEPを参照してください。
安定版の文字から整数への変換API
Kotlin 1.5.0以降、新しい文字からコードへの変換関数と文字から数字への変換関数がStableになりました。これらの関数は、類似の文字列からIntへの変換と混同されがちだった現在のAPI関数を置き換えます。
新しいAPIは、この命名の混乱を解消し、コードの振る舞いをより透過的で曖昧さのないものにします。
このリリースでは、明確に名前が付けられた以下の関数のセットに分けられたChar
変換が導入されます。
Char
の整数コードを取得し、与えられたコードからChar
を構築する関数:
fun Char(code: Int): Char
fun Char(code: UShort): Char
val Char.code: Int
Char
が表す数字の数値に変換する関数:
fun Char.digitToInt(radix: Int): Int
fun Char.digitToIntOrNull(radix: Int): Int?
Int
の拡張関数で、表す非負の単一の数字を対応するChar
表現に変換します。
fun Int.digitToChar(radix: Int): Char
古い変換API、Number.toChar()
とその実装(Int.toChar()
を除くすべて)、およびChar.toInt()
のような数値型への変換のためのChar
拡張は、現在非推奨となっています。
安定版Path API
java.nio.file.Path
の拡張機能を持つ実験的なPath APIが、Stableになりました。
// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
切り捨て除算とmod演算子
標準ライブラリにモジュロ算術のための新しい操作が追加されました。
floorDiv()
は、切り捨て除算の結果を返します。これは整数型で利用可能です。mod()
は、切り捨て除算の剰余(モジュラス)を返します。これはすべての数値型で利用可能です。
これらの操作は既存の整数除算およびrem()関数(または%
演算子)とよく似ていますが、負の数に対しては動作が異なります。
a.floorDiv(b)
は通常の/
とは異なり、floorDiv
は結果を切り下げ(より小さい整数方向へ)、/
は結果を0に近い整数に切り詰めます。a.mod(b)
はa
とa.floorDiv(b) * b
の差です。これはゼロであるか、b
と同じ符号を持ちますが、a % b
は異なる符号を持つことがあります。
fun main() {
println("Floored division -5/3: ${(-5).floorDiv(3)}")
println( "Modulus: ${(-5).mod(3)}")
println("Truncated division -5/3: ${-5 / 3}")
println( "Remainder: ${-5 % 3}")
}
Duration APIの変更点
DANGER
Duration APIは実験的です。これはいつでも廃止または変更される可能性があります。評価目的でのみ使用してください。これに関するフィードバックをYouTrackでお寄せいただければ幸いです。
異なる時間単位での期間量を表現するための実験的なDurationクラスがあります。1.5.0では、Duration APIに以下の変更が加えられました。
- 内部値表現が
Double
の代わりにLong
を使用するようになり、より高い精度を提供します。 - 特定の時間単位への
Long
での変換のための新しいAPIがあります。これは、Double
値で動作し、現在非推奨となっている古いAPIを置き換えるものです。例えば、Duration.inWholeMinutes
は期間の値をLong
として表現したものを返し、Duration.inMinutes
を置き換えます。 - 数値から
Duration
を構築するための新しいコンパニオン関数があります。例えば、Duration.seconds(Int)
は整数の秒数を表すDuration
オブジェクトを作成します。Int.seconds
のような古い拡張プロパティは現在非推奨となっています。
import kotlin.time.Duration
import kotlin.time.ExperimentalTime
@ExperimentalTime
fun main() {
val duration = Duration.milliseconds(120000)
println("There are ${duration.inWholeSeconds} seconds in ${duration.inWholeMinutes} minutes")
}
文字カテゴリを取得するための新しいAPIがマルチプラットフォームコードで利用可能に
Kotlin 1.5.0では、マルチプラットフォームプロジェクトでUnicodeに従った文字のカテゴリを取得するための新しいAPIが導入されました。いくつかの関数が、すべてのプラットフォームおよび共通コードで利用可能になりました。
文字が文字または数字であるかどうかをチェックする関数:
fun main() {
val chars = listOf('a', '1', '+')
val (letterOrDigitList, notLetterOrDigitList) = chars.partition { it.isLetterOrDigit() }
println(letterOrDigitList) // [a, 1]
println(notLetterOrDigitList) // [+]
}
文字のケース(大文字/小文字/タイトルケース)をチェックする関数:
fun main() {
val chars = listOf('Dž', 'Lj', 'Nj', 'Dz', '1', 'A', 'a', '+')
val (titleCases, notTitleCases) = chars.partition { it.isTitleCase() }
println(titleCases) // [Dž, Lj, Nj, Dz]
println(notTitleCases) // [1, A, a, +]
}
その他の関数:
Unicodeに従った文字の一般カテゴリを示すプロパティChar.category
とその戻り値型であるenumクラスCharCategory
も、マルチプラットフォームプロジェクトで利用可能になりました。
新しいコレクション関数 firstNotNullOf()
新しいfirstNotNullOf()
およびfirstNotNullOfOrNull()
関数は、mapNotNull()
とfirst()
またはfirstOrNull()
を組み合わせたものです。これらはカスタムセレクター関数で元のコレクションをマッピングし、最初の非null値を返します。そのような値がない場合、firstNotNullOf()
は例外をスローし、firstNotNullOfOrNull()
はnullを返します。
fun main() {
val data = listOf("Kotlin", "1.5")
println(data.firstNotNullOf(String::toDoubleOrNull))
println(data.firstNotNullOfOrNull(String::toIntOrNull))
}
String?.toBoolean()の厳密版
既存のString?.toBoolean()のケースセンシティブな厳密版を導入する2つの新しい関数が追加されました。
String.toBooleanStrict()
は、リテラルtrue
とfalse
以外のすべての入力に対して例外をスローします。String.toBooleanStrictOrNull()
は、リテラルtrue
とfalse
以外のすべての入力に対してnullを返します。
fun main() {
println("true".toBooleanStrict())
println("1".toBooleanStrictOrNull())
// println("1".toBooleanStrict()) // Exception
}
kotlin-test ライブラリ
kotlin-testライブラリにはいくつかの新機能が導入されました。
マルチプラットフォームプロジェクトにおけるテスト依存関係の使用の簡素化
これで、commonTest
ソースセットにテストのための依存関係を追加するためにkotlin-test
依存関係を使用でき、Gradleプラグインは各テストソースセットに対応するプラットフォーム依存関係を推測します。
- JVMソースセット用の
kotlin-test-junit
。詳細はKotlin/JVMソースセットのテストフレームワークの自動選択を参照してください。 - Kotlin/JSソースセット用の
kotlin-test-js
- 共通ソースセット用の
kotlin-test-common
とkotlin-test-annotations-common
- Kotlin/Nativeソースセット用の追加アーティファクトなし
さらに、kotlin-test
依存関係は、共有またはプラットフォーム固有の任意のソースセットで使用できます。
明示的な依存関係を持つ既存のkotlin-test設定は、GradleとMavenの両方で引き続き機能します。
テストライブラリの依存関係の設定について詳しく学びます。
Kotlin/JVMソースセットのテストフレームワークの自動選択
Gradleプラグインがテストフレームワークへの依存関係を自動的に選択し、追加するようになりました。必要なのは、commonTest
ソースセットにkotlin-test
依存関係を追加することだけです。
GradleはデフォルトでJUnit 4を使用します。したがって、kotlin("test")
依存関係はJUnit 4のバリアント、つまりkotlin-test-junit
に解決されます。
kotlin {
sourceSets {
val commonTest by getting {
dependencies {
implementation(kotlin("test")) // This brings the dependency
// on JUnit 4 transitively
}
}
}
}
kotlin {
sourceSets {
commonTest {
dependencies {
implementation kotlin("test") // This brings the dependency
// on JUnit 4 transitively
}
}
}
}
テストタスク内でuseJUnitPlatform()
またはuseTestNG()
を呼び出すことで、JUnit 5またはTestNGを選択できます。
tasks {
test {
// enable TestNG support
useTestNG()
// or
// enable JUnit Platform (a.k.a. JUnit 5) support
useJUnitPlatform()
}
}
プロジェクトのgradle.properties
にkotlin.test.infer.jvm.variant=false
の行を追加することで、テストフレームワークの自動選択を無効にできます。
テストライブラリの依存関係の設定について詳しく学びます。
アサーション関数の更新
このリリースでは、新しいアサーション関数が追加され、既存の関数が改善されました。
現在、kotlin-test
ライブラリには以下の機能があります。
値の型のチェック
値の型をチェックするために、新しい
assertIs<T>
とassertIsNot<T>
を使用できます。kotlin@Test fun testFunction() { val s: Any = "test" assertIs<String>(s) // throws AssertionError mentioning the actual type of s if the assertion fails // can now print s.length because of contract in assertIs println("${s.length}") }
型消去のため、このアサート関数は以下の例で
value
がList
型であるかどうかのみをチェックし、特定のString
要素型のリストであるかどうかはチェックしません:assertIs<List<String>>(value)
。配列、シーケンス、および任意のイテラブルのコンテナコンテンツの比較
構造的同等性を実装していない異なるコレクションのコンテンツを比較するための、新しいオーバーロードされた
assertContentEquals()
関数のセットがあります。kotlin@Test fun test() { val expectedArray = arrayOf(1, 2, 3) val actualArray = Array(3) { it + 1 } assertContentEquals(expectedArray, actualArray) }
Double
およびFloat
数値のためのassertEquals()
およびassertNotEquals()
の新しいオーバーロード2つの
Double
またはFloat
数値を絶対精度で比較できるようにする、assertEquals()
関数の新しいオーバーロードが追加されました。精度値は関数の3番目のパラメータとして指定されます。kotlin@Test fun test() { val x = sin(PI) // precision parameter val tolerance = 0.000001 assertEquals(0.0, x, tolerance) }
コレクションと要素のコンテンツをチェックする新機能
コレクションまたは要素が何かを含んでいるかどうかを
assertContains()
関数でチェックできるようになりました。これは、IntRange
、String
など、contains()
演算子を持つKotlinコレクションや要素で使用できます。kotlin@Test fun test() { val sampleList = listOf<String>("sample", "sample2") val sampleString = "sample" assertContains(sampleList, sampleString) // element in collection assertContains(sampleString, "amp") // substring in string }
assertTrue()
、assertFalse()
、expect()
関数がインライン化今後、これらをインライン関数として使用できるため、ラムダ式内で中断関数を呼び出すことが可能になります。
kotlin@Test fun test() = runBlocking<Unit> { val deferred = async { "Kotlin is nice" } assertTrue("Kotlin substring should be present") { deferred.await() .contains("Kotlin") } }
kotlinxライブラリ
Kotlin 1.5.0とともに、kotlinxライブラリの新しいバージョンをリリースします。
Coroutines 1.5.0-RC
kotlinx.coroutines
1.5.0-RCは以下を提供します。
- 新しいチャネルAPI
- 安定版のリアクティブ統合
- その他
Kotlin 1.5.0以降、実験的なコルーチンは無効になり、-Xcoroutines=experimental
フラグはサポートされなくなりました。
詳細については、変更ログとkotlinx.coroutines
1.5.0リリースブログ記事を参照してください。
Serialization 1.2.1
kotlinx.serialization
1.2.1は以下を提供します。
- JSONシリアライズパフォーマンスの改善
- JSONシリアライズにおける複数名のサポート
@Serializable
クラスからの実験的な.protoスキーマ生成- その他
詳細については、変更ログとkotlinx.serialization
1.2.1リリースブログ記事を参照してください。
dateTime 0.2.0
kotlinx-datetime
0.2.0は以下を提供します。
@Serializable
なDatetimeオブジェクトDateTimePeriod
とDatePeriod
の正規化されたAPI- その他
詳細については、変更ログとkotlinx-datetime
0.2.0リリースブログ記事を参照してください。
Kotlin 1.5.0への移行
IntelliJ IDEAとAndroid Studioは、Kotlinプラグインが利用可能になり次第、1.5.0への更新を提案します。
既存のプロジェクトをKotlin 1.5.0に移行するには、Kotlinのバージョンを1.5.0
に変更し、GradleまたはMavenプロジェクトを再インポートするだけです。Kotlin 1.5.0への更新方法について学ぶ。
Kotlin 1.5.0で新しいプロジェクトを開始するには、Kotlinプラグインを更新し、File | New | Project からプロジェクトウィザードを実行します。
新しいコマンドラインコンパイラは、GitHubのリリースページからダウンロードできます。
Kotlin 1.5.0は機能リリースであり、そのため言語に互換性のない変更をもたらす可能性があります。そのような変更の詳細なリストは、Kotlin 1.5互換性ガイドにあります。