Kotlin 1.5.0 の新機能
Kotlin 1.5.0 では、新しい言語機能、安定版となった IR ベースの JVM コンパイラバックエンド、パフォーマンスの向上、および実験的機能の安定化や古い機能の非推奨化といった発展的な変更が導入されています。
変更内容の概要については、リリースブログの投稿でもご確認いただけます。
Kotlin のリリースサイクルに関する情報は、Kotlin のリリースプロセスを参照してください。
言語機能
Kotlin 1.5.0 では、1.4.30 でプレビューとして提供された新しい言語機能の安定版が導入されました。
これらの機能の詳細は、こちらのブログ投稿および Kotlin ドキュメントの該当ページで確認できます。
JVM レコードのサポート
Java は急速に進化しており、Kotlin が Java との相互運用性を維持できるように、Java の最新機能の一つである レコードクラス (record classes) のサポートを導入しました。
Kotlin による JVM レコードのサポートには、双方向の相互運用性が含まれます。
- Kotlin コード内では、プロパティを持つ典型的なクラスと同じように Java のレコードクラスを使用できます。
- Kotlin クラスを Java コードでレコードとして使用するには、そのクラスを
dataクラスにし、@JvmRecordアノテーションを付けます。
@JvmRecord
data class User(val name: String, val age: Int)Kotlin での JVM レコードの使用について詳しく学ぶ。
Sealed インターフェース
Kotlin のインターフェースに sealed 修飾子を付けられるようになりました。これはクラスの場合と同様に機能します。sealed インターフェースのすべての実装は、コンパイル時に既知となります。
sealed interface Polygonこの事実を利用して、例えば網羅的な when 式を書くことができます。
fun draw(polygon: Polygon) = when (polygon) {
is Rectangle -> // ...
is Triangle -> // ...
// else は不要 - すべての可能な実装がカバーされているため
}さらに、クラスは複数の sealed インターフェースを直接継承できるため、sealed インターフェースによって、より柔軟に制限されたクラス階層を構築できます。
class FilledRectangle: Polygon, Fillableパッケージ全体の sealed クラス階層
Sealed クラスは、同じコンパイル単位かつ同じパッケージ内のすべてのファイルにサブクラスを持てるようになりました。以前は、すべてのサブクラスを同じファイル内に記述する必要がありました。
直接のサブクラスは、トップレベルに配置することも、他の任意の数の名前付きクラス、名前付きインターフェース、または名前付きオブジェクトの中にネストすることもできます。
Sealed クラスのサブクラスは、適切に修飾された名前(qualified name)を持つ必要があり、ローカルオブジェクトや匿名オブジェクトにすることはできません。
インラインクラス (Inline classes)
インラインクラスは、値のみを保持する値ベース (value-based)のクラスのサブセットです。メモリ割り当てによる追加のオーバーヘッドなしに、特定の型の値のラッパーとして使用できます。
インラインクラスは、クラス名の前に 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、およびコマンドラインコンパイラでのコンパイラオプションの追加方法は、Gradle、Maven、およびコマンドラインコンパイラを参照してください。
invokedynamic を介したラムダ
純粋な Kotlin ラムダを
invokedynamicにコンパイルする機能は実験的(Experimental)です。これはいつでも削除または変更される可能性があります。使用にはオプトインが必要であり(詳細は下記参照)、評価目的でのみ使用してください。YouTrack でのフィードバックをお待ちしております。
Kotlin 1.5.0 では、純粋な Kotlin ラムダ(関数型インターフェースのインスタンスに変換されないもの)を動的呼び出し (invokedynamic) にコンパイルする実験的サポートを導入しています。この実装は、LambdaMetafactory.metafactory() を使用することで実行時に必要なクラスを効果的に生成し、より軽量なバイナリを生成します。現在、通常のラムダコンパイルと比較して 3 つの制限があります。
invokedynamicにコンパイルされたラムダはシリアライズできません。- そのようなラムダに対して
toString()を呼び出すと、可読性の低い文字列が返されます。 - 実験的な
reflectAPI は、LambdaMetafactoryで作成されたラムダをサポートしていません。
この機能を試すには、-Xlambdas=indy コンパイラオプションを追加してください。この YouTrack チケット を使用してフィードバックを共有していただければ幸いです。
Gradle、Maven、およびコマンドラインコンパイラでのコンパイラオプションの追加方法は、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 からの型の null 許容情報を取り扱うことをサポートしています。Kotlin 1.5.0 では、この機能にいくつかの改善が導入されました。
- 依存関係として使用されるコンパイル済みの Java ライブラリの型引数にある nullability アノテーションを読み取ります。
- 以下の
TYPE_USEターゲットを持つ nullability アノテーションをサポートします:- 配列
- 可変長引数 (Varargs)
- フィールド
- 型パラメータとその境界 (bounds)
- ベースクラスおよびインターフェースの型引数
- nullability アノテーションに型に適用可能な複数のターゲットがあり、そのターゲットの一つが
TYPE_USEである場合、TYPE_USEが優先されます。 例えば、@NullableがTYPE_USEとMETHODの両方のターゲットをサポートしている場合、メソッドのシグネチャ@Nullable String[] f()はfun f(): Array<String?>!となります。
これらの新しくサポートされたケースにおいて、Kotlin から Java を呼び出す際に誤った型の null 許容を使用すると警告が生成されます。これらのケースで厳密モード(エラー報告あり)を有効にするには、-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=staticiosArm64の場合 :kotlin.native.cacheKind.iosArm64=static
コンパイラキャッシュを有効にした後に問題が発生した場合は、イシュートラッカー YouTrack に報告してください。
その他の改善により、Kotlin/Native コードの実行速度も向上しました。
- 些細な(Trivial)プロパティアクセサがインライン化されます。
- 文字列リテラルの
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 コンパイラ向けのフレームワークとライブラリ
Kotlin/JS IR コンパイラは アルファ版 (Alpha) です。将来的に互換性のない変更が行われ、手動での移行が必要になる可能性があります。YouTrack でのフィードバックをお待ちしております。
Kotlin/JS コンパイラの IR ベースのバックエンドの作業とともに、ライブラリの作者がプロジェクトを both モードでビルドすることを奨励・支援しています。これにより、両方の Kotlin/JS コンパイラ向けのアーティファクトを生成でき、新しいコンパイラのエコシステムを拡大できます。
多くの有名なフレームワークやライブラリがすでに IR バックエンドで利用可能です:KVision、fritz2、doodle など。これらをプロジェクトで使用している場合、すでに IR バックエンドでビルドして、その利点を確認することができます。
自身のライブラリを執筆している場合は、クライアントが新しいコンパイラでも使用できるように、'both' モードでコンパイルしてください。
Kotlin マルチプラットフォーム
Kotlin 1.5.0 では、各プラットフォームのテスト依存関係の選択が簡素化され、Gradle プラグインによって自動的に行われるようになりました。
マルチプラットフォームプロジェクトで文字(char)のカテゴリを取得するための新しい API も利用可能になりました。
標準ライブラリ
標準ライブラリは、実験的機能の安定化から新機能の追加まで、多岐にわたる変更と改善を受けました。
- 安定版 符号なし整数型
- 安定版 ロケールに依存しない大文字/小文字変換 API
- 安定版 Char から整数への変換 API
- 安定版 Path API
- 床関数除算 (Floored division) と mod 演算子
- Duration API の変更
- マルチプラットフォームコードで利用可能になった文字カテゴリ取得用 API
- 新しいコレクション関数 firstNotNullOf()
- String?.toBoolean() の厳密版
標準ライブラリの変更についての詳細は、こちらのブログ投稿で確認できます。
安定版 符号なし整数型
UInt、ULong、UByte、UShort の符号なし整数型が安定版(Stable)となりました。これらの型に対する演算、レンジ、プログレッションも同様です。符号なし配列とその演算は Beta のままです。
安定版 ロケールに依存しない大文字/小文字変換 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(): CharChar.uppercase(): StringChar.toLowerCase()Char.lowercaseChar(): CharChar.lowercase(): StringChar.toTitleCase()Char.titlecaseChar(): CharChar.titlecase(): String
Kotlin/JVM の場合、明示的な
Localeパラメータを持つオーバーロードされたuppercase()、lowercase()、およびtitlecase()関数も存在します。
古い API 関数は非推奨としてマークされており、将来のリリースで削除される予定です。
テキスト処理機能への変更の全リストは KEEP を参照してください。
安定版 Char から整数への変換 API
Kotlin 1.5.0 から、新しい char-to-code(文字からコードへ)および char-to-digit(文字から数字へ)変換関数が安定版(Stable)となりました。これらの関数は、同様の string-to-Int(文字列から整数へ)変換と混同されやすかった現在の API 関数を置き換えます。
新しい API はこの命名の混乱を解消し、コードの振る舞いをより透明かつ明確にします。
このリリースでは、以下の明確に命名された関数セットに分かれた Char 変換が導入されています。
Charの整数コードを取得し、与えられたコードからCharを構築する関数:
fun Char(code: Int): Char
fun Char(code: UShort): Char
val Char.code: IntCharをそれが表す数字の数値に変換する関数:
fun Char.digitToInt(radix: Int): Int
fun Char.digitToIntOrNull(radix: Int): Int?- 非負の 1 桁の数値を対応する
Char表現に変換するためのIntの拡張関数:
fun Int.digitToChar(radix: Int): CharNumber.toChar() とその実装(Int.toChar() 以外すべて)や、Char.toInt() のような数値型への変換のための Char 拡張機能を含む古い変換 API は、現在非推奨となっています。
KEEP で char から整数への変換 API について詳しく学ぶ。
安定版 Path API
java.nio.file.Path の拡張機能を備えた実験的な Path API が安定版(Stable)となりました。
// div (/) 演算子を使用してパスを構築
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// ディレクトリ内のファイルをリストアップ
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")床関数除算 (Floored division) と mod 演算子
モジュロ演算(modular arithmetics)のための新しい演算が標準ライブラリに追加されました。
floorDiv()は床関数除算 (floored division) の結果を返します。整数型で利用可能です。mod()は床関数除算の余り(modulus)を返します。すべての数値型で利用可能です。
これらの演算は既存の整数の除算や rem() 関数(または % 演算子)とよく似ていますが、負の数に対して異なる動作をします。
a.floorDiv(b)は通常の/と異なり、floorDivは結果を切り下げ(より小さい整数に向かって)ますが、/は結果を 0 に近い方の整数に切り捨てます。a.mod(b)はaとa.floorDiv(b) * bの差です。これは 0 か、bと同じ符号になりますが、a % bは異なる符号になることがあります。
fun main() {
println("床関数除算 -5/3: ${(-5).floorDiv(3)}")
println( "剰余 (Modulus): ${(-5).mod(3)}")
println("切り捨て除算 -5/3: ${-5 / 3}")
println( "余り (Remainder): ${-5 % 3}")
}Duration API の変更
Duration API は実験的(Experimental)です。これはいつでも削除または変更される可能性があります。評価目的でのみ使用してください。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("${duration.inWholeMinutes} 分には、${duration.inWholeSeconds} 秒あります")
}マルチプラットフォームコードで利用可能になった文字カテゴリ取得用 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, +]
}その他の関数:
プロパティ Char.category とその戻り値の型である列挙型クラス CharCategory(Unicode に基づく文字の一般カテゴリを示す)も、マルチプラットフォームプロジェクトで利用可能になりました。
新しいコレクション関数 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()) // 例外が発生します
}kotlin-test ライブラリ
kotlin-test ライブラリにいくつかの新機能が導入されました:
マルチプラットフォームプロジェクトにおけるテスト依存関係の使用の簡素化
kotlin-test 依存関係を使用して commonTest ソースセットにテスト用の依存関係を追加できるようになりました。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 プラグインが、テストフレームワークへの依存関係を自動的に選択して追加するようになりました。共通ソースセットに kotlin-test の依存関係を追加するだけで済みます。
Gradle はデフォルトで JUnit 4 を使用します。そのため、kotlin("test") 依存関係は JUnit 4 用のバリアント、すなわち kotlin-test-junit に解決されます。
kotlin {
sourceSets {
val commonTest by getting {
dependencies {
implementation(kotlin("test")) // これにより JUnit 4 への依存関係が
// 推移的に取り込まれます
}
}
}
}kotlin {
sourceSets {
commonTest {
dependencies {
implementation kotlin("test") // これにより JUnit 4 への依存関係が
// 推移的に取り込まれます
}
}
}
}テストタスクで useJUnitPlatform() または useTestNG() を呼び出すことで、JUnit 5 または TestNG を選択できます。
tasks {
test {
// TestNG サポートを有効にする
useTestNG()
// または
// JUnit Platform (別名 JUnit 5) サポートを有効にする
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) // アサーションが失敗した場合、s の実際の型を明記した AssertionError をスローします // assertIs 内のコントラクトにより、s.length を出力できるようになります println("${s.length}") }型消去 (Type erasure) のため、次の例の
assertIs<List<String>>(value)は、valueがList型であるかどうかのみをチェックし、特定のString要素型のリレーショナルリストであるかどうかはチェックしません。配列、シーケンス、および任意のイテラブルのコンテナ内容の比較
構造的な等価性 (Structural equality) を実装していない異なるコレクションの内容を比較するための、オーバーロードされた
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) // 精度パラメータ 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) // コレクション内の要素 assertContains(sampleString, "amp") // 文字列内の部分文字列 }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 はフィーチャーリリース (feature release) であるため、言語に互換性のない変更をもたらす可能性があります。そのような変更の詳細なリストは、Kotlin 1.5 互換性ガイドで見つけることができます。
