Kotlin
A concise multiplatform language developed by JetBrains
Kotlin 1.4-M3 公開: 標準ライブラリに関する変更
先日、Kotlin 1.4 の最終マイルストーンプレビュー 1.4-M3 を公開しました。 この記事では、このプレビューの公開に際した Kotlin 標準ライブラリへの変更を説明します。 M3 では、ほかのコンポーネントも更新されています。それらについては、Kotlin 1.4 のスコープを締めるリリース候補バージョン(1.4-RC)を以て、近日別のブログ記事で紹介します。
1.4-M3 の標準ライブラリには、次のような変更点があります。
- JVM ライブラリに、
module-info
記述子が追加されました - 関数型インターフェースが標準ライブラリに追加されました
- 実世界のケースに対応する新しいコレクション型演算
- 共通ライブラリの
@Throws
注釈 - 一部の浮動小数点数配列の廃止
完全な変更リストは変更ログで確認できます。 これまで同様、社外貢献者の皆様からのご協力に深く感謝いたします。
ぜひプレビューをお試しの上、フィードバックをお送りください。
標準ライブラリアーティファクトに module-info 記述子を追加
Jigsaw プロジェクトのおかげで、Java 9 より、アプリケーションをモジュール化できるようになりました。 jlink ツールを使用して、アプリに必要なプラットフォームモジュールのみを含むカスタム Java ランタイムイメージを生成することができます。以前から jlink
を Kotlin の標準ライブラリアーティファクトと使用することはできましたが、これには “modular” 分類子を持つ個別のアーティファクトを使用する必要があり、セットアップ全体の明確さに欠けていました。 メインのアーティファクトにモジュール記述子を含められなかった原因は、Android ツールにおける課題にありましたが、この課題は修正されています。
Kotlin 1.4 では、module-info.java
モジュール情報の追加により、標準ライブラリアーティファクトがデフォルトに設定されるようになったため、jlink
との使用が簡単になっています。 Android では、Android Gradle プラグインバージョン 3.2 以降を必ず使用するようにしてください。module-info を持つ jar を正しく処理することができます。
標準ライブラリの fun interface
Kotlin 1.4 では、Kotlin クラスの SAM 変換がサポートされます。 単一の抽象メソッドのみを持つインターフェースを fun interface
としてマークし、そのインターフェースがパラメータとして期待される場合に引数としてラムダ式を渡すことができます。 標準ライブラリでは、次のインターフェースが fun interface
として宣言されるようになりました。
Comparator
ReadOnlyProperty
PropertyDelegateProvider
(1.4-M2 で導入)
インスタンスの作成には、ラムダ式をパラメータとして取る SAM-constructor を使用できます。 コードが大幅に単純化されます。
コレクション型演算
- 新しい
sumOf
関数は、コレクションのすべての要素においてセレクター関数を取り、その値の合計を返します。 既存のsumBy
とsumByDouble
関数に非常によく似ていますが、 主な違いは、新しいsumOf
関数は、戻り値の型が多様なセレクターを取るため、異なる型の合計を同じように処理できるという点にあります。 sumOf では、Int
、Long
、Double
、UInt
、ULong
の型の合計を生成できます。 JVM では、BigInteger
とBigDecimal
も使用できます。 min
関数とmax
関数の名前は、それぞれminOrNull
とmaxOrNull
に変更されました。 1.0 で導入されて以来、min
とmax
は空のコレクションに対しnull
を返してきました。 これは、Kotlin の Collections API で使用されている命名規則と異なります。*OrNull
サフィックスのない関数は、レシーバコレクションが空である場合に例外をスローしてしまいます。 代わりにnull
を取得するには、firstOrNull
のように、この関数の*OrNull
バージョンを使用する必要があります。
そこで、min
とmax
の動作を徐々に変更することにしました。 1.4-M3 では、min
とmax
の類義語としてminOrNull
とmaxOrNull
を追加し、 null ではない型の値を戻すmin
とmax
として導入しなおすことを前提に廃止サイクルを開始することになりました。- コレクションの項目に対するあるセレクター関数の最小値または最大値を返す
minOf
関数とmaxOf
関数を導入しました。 これらの関数は、map { selector }.max()!!
またはmaxBy { selector }!!.selector
(またはmin
とminBy
)を記述するのに必要だったケースをカバーします。既存の API との一貫性を維持するために、
minOfWith
とmaxOfWith
も追加しました。これらは、Comparator
を引数として取ります。
4 つすべての新しい関数は、上記で説明した null 以外の方法に従い、空のコレクションで例外をスローします。そのため、この場合にnull
を返す*orNull
バージョンが用意されています。 flatMap
とflatMapTo
の新しいオーバーロードでは、レシーバの型と一致しない戻り値の型で変換を使用できます。Iterable
、Array
、およびMap
でSequence
に変換Sequence
でIterable
に変換
- 新しい
flatMapIndexed
関数は、flatMap
に対応する関数として追加されました。 すでにご存知かもしれませんが、コレクションを処理する関数の目的でIndexed
すると、適用される演算のパラメーターとして要素インデックスが含まれることになります。
共通の @Throws 注釈
Kotlin は例外をチェックしませんが、Java や Swift といった例外チェックを行う言語との互換性を得るために、 @Throws
注釈を使用します。 以前は、JVM 用(kotlin.jvm.Throws
)と Native 用(kotlin.native.Throws
)のそれぞれに対し、この名前の注釈を別々に使用していました。 1.4-M3 からは、 @Throws
注釈は、共通ライブラリの一部として、kotlin
パッケージ(kotlin.Throws
)で直接使用できます。
Swift および Objective-C のサスペンド関数の @Throws
1.4-M1 では、Objective-C/Swift 相互運用機能における例外処理に関する変更を発表し、例外が、 @Throws
注釈のパラメータとして指定されるクラス(またはそのサブクラス)のインスタンスである場合にのみ NSError
がスローされるようになりました。 また 1.4-M2 では、Swift と Objective-C における Kotlin のサスペンド関数の基本サポートが導入されました。 そして 1.4-M3 では、 @Throws
で注釈付けされたサスペンド関数の振る舞いに小さな変更が加えられています。
@Throws
で注釈付けされたsuspend fun
がある場合、その@Throws
注釈のパラメータとしてCancellationException::class
を指定する必要があります。 指定しない場合、コンパイルエラーが発生します。suspend fun
に@Throws
注釈がない場合、Swift からそれを呼び出すと、明示的に@Throws(CancellationException::class)
が使用されます。
浮動小数点数配列の等値性
コンテナ型に使用できる手ごろな拡張関数 contains
、indexOf
、およびlastIndexOf
を知っている方はたくさんいると思います。 しばらく前のことになりますが、浮動小数点数配列(FloatArray
および DoubleArray
)におけるこれらの関数の振る舞いは賛否両論であり、誤っているように見えかねないと判定しました。
もう少し具体的に言うと、これらの関数は、浮動小数点数の計算で一般的な IEEE 754 を使用しています。 この標準は、コーナーケースにおける等値性に関し、次の規則を定義しています。
NaN
はNaN
と同等ではない-0.0
は0.0
と同等である
こういった規則では、次のように予測できない結果が発生する可能性があります。
また、total order 等値性を使用しているため、同一の関数がリストにおいて動作する振る舞いも一定しません。
1.4-M3 では、FloatArray
と DoubleArray
の contains
、indexOf
、および lastIndexOf
拡張関数の使用廃止サイクルが始まります。 これらを使用しようとすると、関数の使用箇所を置き換える指示を出す警告が表示されます。
今後のリリースにおいては、使用廃止レベルを ERROR
にし、パブリック API から除去する予定です。
KType から Java Type への変換
Kolin 1.3.40 では、標準ライブラリに便利な typeOf
関数を追加しました。 この関数は、具体化された型 T
の実行時の表現を KType
のインスタンスとして返します。 しかし、多くの実用的なユースケースでは、KType
ではなく、Java reflection java.lang.reflect.Type
オブジェクトを使用する必要があります。 必要な変換を実行することはすでに可能でしたが、これには、完全な kotlin-reflect
依存関係が必要でした。 そこで、KType
から Java Type
に変換する方法として、Java Type
を返す KType.javaType
拡張プロパティを標準ライブラリに追加しました。
現在のところ、取得した Java Type
は一部のコーナーケース(注釈付きの型パラメータや declaration-site の分散など)では正しく動作しないため、KType.javaType
は実験的機能ステータスのままとなります。 サポートされていないケースに関する詳細は、こちらの課題を参照してください。
互換性
一部のコーナーケースにおいて、Kotlin 1.4には1.3との下位互換性はありません。 Kotlin言語委員会はそういったケースを注意深くレビューし、「互換性ガイド」(これに似た様式)として掲載する予定です。 現時点では、YouTrack でこのリストをご覧ください。
プレリリースノート
下位互換性保証は、プレリリースバージョンには適用されません。 機能や API は、後続のリリースで変更する場合があります。 最終RCに達すると、プレリリースバージョンで生成したすべてのバイナリは、コンパイラによって使用禁止となります。その場合、1.4-Mxでコンパイルしたすべてのものを再コンパイルする必要があります。
新機能を試すには
いつものように、play.kotl.inでKotlinをオンラインで試すことができます。
IntelliJ IDEA と Android Studio 内で、Kotlin プラグインをバージョン1.4-M3 に更新できます。 その方法についてはこれを参照してください。
プレリリースバージョンをインストールする前に作成された既存のプロジェクトを使用する場合、GradleまたはMavenでプレビューバージョン用にビルドを構成する必要があります。
コマンドラインコンパイラは、GitHubリリースページからダウンロードできます。
このリリースとともに公開された次のバージョンのライブラリを使用できます。
- kotlinx.atomicfu バージョン: 0.14.3-1.4-M3
- kotlinx.coroutines バージョン: 1.3.7-1.4-M3
- kotlinx.serialization バージョン: 0.20.0-1.4-M3
- ktor バージョン: 1.3.2-1.4-M3
リリースの詳細と互換性のあるライブラリの一覧は、ここから入手できます。
ご意見をお寄せください
課題トラッカーにたくさんのバグレポートをお寄せいただき、ありがとうございました。最終リリースまでに、最も重要な課題すべてを修正できるように努めさせていただきます。
また、ぜひ Kotlin Slack の #eap チャンネル にご参加ください(招待状はこちらから入手できます)。 このチャンネルでは、質問、ディスカッションへの参加、新しいプレビュービルドについて知ることができます。
Kotlinを使ってみよう!
ご協力いただいた外部貢献者
このリリースに含められた Pull リクエストは、次の外部貢献者からいただきました。ご協力いただきありがとうございました。
- Toshiaki Kameyama
- Steven Schäfer
- Jinseong Jeon
- pyos
- Mark Punzalan
- rapturemain
- Vitaly Tihonov
- Mads Ager
- Subroh Nishikori
- Juan Chen
- gcx11
- Robert Bares
- Henrik Tunedal
- Nick
- Dmitry Borodin
- Efeturi Money
- Kevin Most
- Anastasiya Krasnoryadtseva
- Kristoffer Andersen
- Martin Petrov
- Matthew Gharrity
- Mike Samuel
- Mikhail Likholetov
- Segun Famisa
- Sinan Kozak
- Vadim Semenov
- Valeriy Vyrva
- Victor Turansky
- Yuku Kotani