Kotlin 1.4-M3 公開: 標準ライブラリに関する変更

投稿日 投稿者 Elizaveta Semakova

先日、Kotlin 1.4 の最終マイルストーンプレビュー 1.4-M3 を公開しました。 この記事では、このプレビューの公開に際した Kotlin 標準ライブラリへの変更を説明します。 M3 では、ほかのコンポーネントも更新されています。それらについては、Kotlin 1.4 のスコープを締めるリリース候補バージョン(1.4-RC)を以て、近日別のブログ記事で紹介します。

1.4-M3 の標準ライブラリには、次のような変更点があります。

完全な変更リストは変更ログで確認できます。 これまで同様、社外貢献者の皆様からのご協力に深く感謝いたします。

ぜひプレビューをお試しの上、フィードバックをお送りください

標準ライブラリアーティファクトに 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
  • PropertyDelegateProvider1.4-M2 で導入)

インスタンスの作成には、ラムダ式をパラメータとして取る SAM-constructor を使用できます。 コードが大幅に単純化されます。

コレクション型演算

  • 新しい sumOf 関数は、コレクションのすべての要素においてセレクター関数を取り、その値の合計を返します。 既存の sumBysumByDouble 関数に非常によく似ていますが、 主な違いは、新しい sumOf 関数は、戻り値の型が多様なセレクターを取るため、異なる型の合計を同じように処理できるという点にあります。 sumOf では、IntLongDoubleUIntULong の型の合計を生成できます。 JVM では、BigIntegerBigDecimal も使用できます。
  • min 関数と max 関数の名前は、それぞれ minOrNullmaxOrNull に変更されました。 1.0 で導入されて以来、minmax は空のコレクションに対し null を返してきました。 これは、Kotlin の Collections API で使用されている命名規則と異なります。*OrNull サフィックスのない関数は、レシーバコレクションが空である場合に例外をスローしてしまいます。 代わりに null を取得するには、firstOrNull のように、この関数の *OrNull バージョンを使用する必要があります。
    そこで、minmax の動作を徐々に変更することにしました。 1.4-M3 では、 minmax の類義語として minOrNullmaxOrNull を追加し、 null ではない型の値を戻す minmax として導入しなおすことを前提に廃止サイクルを開始することになりました。
  • コレクションの項目に対するあるセレクター関数の最小値または最大値を返す minOf 関数と maxOf 関数を導入しました。 これらの関数は、map { selector }.max()!! またはmaxBy { selector }!!.selector(または minminBy)を記述するのに必要だったケースをカバーします。

    既存の API との一貫性を維持するために、minOfWithmaxOfWith も追加しました。これらは、Comparator を引数として取ります。
    4 つすべての新しい関数は、上記で説明した null 以外の方法に従い、空のコレクションで例外をスローします。そのため、この場合に null を返す *orNull バージョンが用意されています。

  • flatMapflatMapTo の新しいオーバーロードでは、レシーバの型と一致しない戻り値の型で変換を使用できます。
    • IterableArray、および MapSequence に変換
    • SequenceIterable に変換
  • 新しい 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) が使用されます。

浮動小数点数配列の等値性

コンテナ型に使用できる手ごろな拡張関数 containsindexOf、およびlastIndexOf を知っている方はたくさんいると思います。 しばらく前のことになりますが、浮動小数点数配列(FloatArray および DoubleArray)におけるこれらの関数の振る舞いは賛否両論であり、誤っているように見えかねないと判定しました。
もう少し具体的に言うと、これらの関数は、浮動小数点数の計算で一般的な IEEE 754 を使用しています。 この標準は、コーナーケースにおける等値性に関し、次の規則を定義しています。

  • NaN NaN と同等ではない
  • -0.0 0.0 と同等である

こういった規則では、次のように予測できない結果が発生する可能性があります。

また、total order 等値性を使用しているため、同一の関数がリストにおいて動作する振る舞いも一定しません。

1.4-M3 では、FloatArrayDoubleArraycontainsindexOf、および 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.inKotlinをオンラインで試すことができます。

IntelliJ IDEAAndroid Studio 内で、Kotlin プラグインをバージョン1.4-M3 に更新できます。 その方法についてはこれを参照してください。

プレリリースバージョンをインストールする前に作成された既存のプロジェクトを使用する場合、GradleまたはMavenでプレビューバージョン用にビルドを構成する必要があります。

コマンドラインコンパイラは、GitHubリリースページからダウンロードできます。

このリリースとともに公開された次のバージョンのライブラリを使用できます。

リリースの詳細と互換性のあるライブラリの一覧は、ここから入手できます。

ご意見をお寄せください

課題トラッカーにたくさんのバグレポートをお寄せいただき、ありがとうございました。最終リリースまでに、最も重要な課題すべてを修正できるように努めさせていただきます。

また、ぜひ Kotlin Slack#eap チャンネル にご参加ください(招待状はこちらから入手できます)。 このチャンネルでは、質問、ディスカッションへの参加、新しいプレビュービルドについて知ることができます。

Kotlinを使ってみよう!

ご協力いただいた外部貢献者

このリリースに含められた Pull リクエストは、次の外部貢献者からいただきました。ご協力いただきありがとうございました。

配信登録

更新情報を購読する