Skip to content

中級: ライブラリとAPI

Kotlinを最大限に活用するには、既存のライブラリとAPIを使用することで、車輪の再発明に時間を費やすことなく、より多くの時間をコーディングに充てることができます。

ライブラリは、一般的なタスクを簡素化する再利用可能なコードを配布します。ライブラリ内には、関連するクラス、関数、ユーティリティをグループ化するパッケージやオブジェクトがあります。ライブラリは、開発者がコードで使用できる関数、クラス、またはプロパティのセットとしてAPI (Application Programming Interfaces) を公開します。

KotlinのライブラリとAPI

Kotlinで何ができるか見てみましょう。

標準ライブラリ

Kotlinには、コードを簡潔かつ表現豊かにするための必須の型、関数、コレクション、ユーティリティを提供する標準ライブラリがあります。標準ライブラリの大部分(kotlinパッケージ内のすべて)は、明示的にインポートする必要なく、任意のKotlinファイルで利用できます。

kotlin
fun main() {
    val text = "emosewa si niltoK"
    
   // Use the reversed() function from the standard library
    val reversedText = text.reversed()

    // Use the print() function from the standard library
    print(reversedText)
    // Kotlin is awesome
}

ただし、標準ライブラリの一部は、コードで使用する前にインポートが必要です。たとえば、標準ライブラリの時刻測定機能を使用したい場合は、kotlin.timeパッケージをインポートする必要があります。

ファイルの先頭に、importキーワードと必要なパッケージを追加します。

kotlin
import kotlin.time.*

アスタリスク*は、パッケージ内のすべてをインポートするようにKotlinに指示するワイルドカードインポートです。アスタリスク*をコンパニオンオブジェクトで使用することはできません。代わりに、使用したいコンパニオンオブジェクトのメンバーを明示的に宣言する必要があります。

例:

kotlin
import kotlin.time.Duration
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.minutes

fun main() {
    val thirtyMinutes: Duration = 30.minutes
    val halfHour: Duration = 0.5.hours
    println(thirtyMinutes == halfHour)
    // true
}

この例では、次のことを行っています。

  • Durationクラスと、そのコンパニオンオブジェクトのhoursおよびminutes拡張プロパティをインポートします。
  • minutesプロパティを使用して30を30分のDurationに変換します。
  • hoursプロパティを使用して0.5を30分のDurationに変換します。
  • 両方の期間が等しいかどうかを確認し、結果を出力します。

構築する前に検索する

自分でコードを書くことを決める前に、探しているものが既に存在するかどうかを標準ライブラリで確認してください。以下は、標準ライブラリが既に多くのクラス、関数、プロパティを提供している領域のリストです。

標準ライブラリのその他の内容については、APIリファレンスを参照してください。

Kotlinライブラリ

標準ライブラリは多くの一般的なユースケースをカバーしていますが、対応していないものもあります。幸いなことに、Kotlinチームとコミュニティは、標準ライブラリを補完する幅広いライブラリを開発しています。たとえば、kotlinx-datetimeは、さまざまなプラットフォームで時刻を管理するのに役立ちます。

便利なライブラリは、検索プラットフォームで見つけることができます。それらを使用するには、依存関係の追加やプラグインの追加など、追加の手順が必要です。各ライブラリには、Kotlinプロジェクトに含める方法に関する指示が記載されたGitHubリポジトリがあります。

ライブラリを追加したら、その中の任意のパッケージをインポートできます。以下は、kotlinx-datetimeパッケージをインポートしてニューヨークの現在の時刻を検索する例です。

kotlin
import kotlinx.datetime.*

fun main() {
    val now = Clock.System.now() // Get current instant
    println("Current instant: $now")

    val zone = TimeZone.of("America/New_York")
    val localDateTime = now.toLocalDateTime(zone)
    println("Local date-time in NY: $localDateTime")
}

この例では、次のことを行っています。

  • kotlinx.datetimeパッケージをインポートします。
  • Clock.System.now()関数を使用して現在の時刻を含むInstantクラスのインスタンスを作成し、結果をnow変数に割り当てます。
  • 現在の時刻を出力します。
  • TimeZone.of()関数を使用してニューヨークのタイムゾーンを見つけ、結果をzone変数に割り当てます。
  • 現在の時刻を含むインスタンスで.toLocalDateTime()関数を呼び出し、ニューヨークのタイムゾーンを引数として渡します。
  • 結果をlocalDateTime変数に割り当てます。
  • ニューヨークのタイムゾーンに合わせて調整された時刻を出力します。

TIP

この例で使用されている関数とクラスの詳細については、APIリファレンスを参照してください。

APIをオプトインする

ライブラリの作者は、特定のAPIをコードで使用する前にオプトインが必要であるとマークする場合があります。これは通常、APIがまだ開発中であり、将来変更される可能性がある場合に実行されます。オプトインしない場合、次のような警告またはエラーが表示されます。

text
This declaration needs opt-in. Its usage should be marked with '@...' or '@OptIn(...)'

オプトインするには、@OptInの後に、APIを分類するクラス名を括弧で囲み、二重コロン::classを付けます。

たとえば、標準ライブラリのuintArrayOf()関数は、APIリファレンスに示されているように、@ExperimentalUnsignedTypesに分類されます。

kotlin
@ExperimentalUnsignedTypes
inline fun uintArrayOf(vararg elements: UInt): UIntArray

コードでのオプトインは次のようになります。

kotlin
@OptIn(ExperimentalUnsignedTypes::class)

以下は、uintArrayOf()関数を使用して符号なし整数の配列を作成し、その要素の1つを変更するためにオプトインする例です。

kotlin
@OptIn(ExperimentalUnsignedTypes::class)
fun main() {
    // Create an unsigned integer array
    val unsignedArray: UIntArray = uintArrayOf(1u, 2u, 3u, 4u, 5u)

    // Modify an element
    unsignedArray[2] = 42u
    println("Updated array: ${unsignedArray.joinToString()}")
    // Updated array: 1, 2, 42, 4, 5
}

これが最も簡単なオプトイン方法ですが、他にも方法があります。詳細については、オプトイン要件を参照してください。

練習問題

練習問題 1

ユーザーが投資の将来価値を計算するのに役立つ金融アプリケーションを開発しています。複利を計算する式は次のとおりです。

A = P \times (1 + \displaystyle\frac{r}{n})^{nt}

ここで:

  • Aは利子が付いた後の積立金額(元本 + 利子)です。
  • Pは元本(初期投資額)です。
  • rは年利(小数)です。
  • nは1年間に利子が複利計算される回数です。
  • tは投資期間(年単位)です。

コードを更新して、次のことを行います。

  1. kotlin.mathパッケージから必要な関数をインポートします。
  2. calculateCompoundInterest()関数に、複利を適用した後の最終的な金額を計算する本体を追加します。

|--|--|

kotlin
// Write your code here

fun calculateCompoundInterest(P: Double, r: Double, n: Int, t: Int): Double {
    // Write your code here
}

fun main() {
    val principal = 1000.0
    val rate = 0.05
    val timesCompounded = 4
    val years = 5
    val amount = calculateCompoundInterest(principal, rate, timesCompounded, years)
    println("The accumulated amount is: $amount")
    // The accumulated amount is: 1282.0372317085844
}

|---|---|

kotlin
import kotlin.math.*

fun calculateCompoundInterest(P: Double, r: Double, n: Int, t: Int): Double {
    return P * (1 + r / n).pow(n * t)
}

fun main() {
    val principal = 1000.0
    val rate = 0.05
    val timesCompounded = 4
    val years = 5
    val amount = calculateCompoundInterest(principal, rate, timesCompounded, years)
    println("The accumulated amount is: $amount")
    // The accumulated amount is: 1282.0372317085844
}

練習問題 2

プログラムで複数のデータ処理タスクを実行するのにかかる時間を測定したいと考えています。kotlin.timeパッケージから正しいインポート文と関数を追加するようにコードを更新してください。

|---|---|

kotlin
// Write your code here

fun main() {
    val timeTaken = /* Write your code here */ {
    // Simulate some data processing
    val data = List(1000) { it * 2 }
    val filteredData = data.filter { it % 3 == 0 }

    // Simulate processing the filtered data
    val processedData = filteredData.map { it / 2 }
    println("Processed data")
}

println("Time taken: $timeTaken") // e.g. 16 ms
}

|---|---|

kotlin
import kotlin.time.measureTime

fun main() {
    val timeTaken = measureTime {
        // Simulate some data processing
        val data = List(1000) { it * 2 }
        val filteredData = data.filter { it % 3 == 0 }

        // Simulate processing the filtered data
        val processedData = filteredData.map { it / 2 }
        println("Processed data")
    }

    println("Time taken: $timeTaken") // e.g. 16 ms
}

練習問題 3

最新のKotlinリリースで利用できる標準ライブラリに新しい機能があります。それを試したいのですが、オプトインが必要です。この機能は@ExperimentalStdlibApiに分類されます。コードではオプトインはどのように記述されますか?

|---|---|

kotlin
@OptIn(ExperimentalStdlibApi::class)

次のステップ

おめでとうございます!中級ツアーを完了しました!次のステップとして、人気のKotlinアプリケーションに関するチュートリアルをチェックしてください。