中級: ライブラリとAPI
拡張関数
スコープ関数
レシーバ付きラムダ式
クラスとインターフェース
オブジェクト
オープンクラスと特殊クラス
プロパティ
Null安全性
ライブラリとAPI
Kotlinを最大限に活用するには、既存のライブラリとAPIを使用することで、車輪の再発明に時間を費やすことなく、より多くの時間をコーディングに充てることができます。
ライブラリは、一般的なタスクを簡素化する再利用可能なコードを配布します。ライブラリ内には、関連するクラス、関数、ユーティリティをグループ化するパッケージやオブジェクトがあります。ライブラリは、開発者がコードで使用できる関数、クラス、またはプロパティのセットとしてAPI (Application Programming Interfaces) を公開します。
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
キーワードと必要なパッケージを追加します。
import kotlin.time.*
アスタリスク*
は、パッケージ内のすべてをインポートするように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
パッケージをインポートしてニューヨークの現在の時刻を検索する例です。
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がまだ開発中であり、将来変更される可能性がある場合に実行されます。オプトインしない場合、次のような警告またはエラーが表示されます。
This declaration needs opt-in. Its usage should be marked with '@...' or '@OptIn(...)'
オプトインするには、@OptIn
の後に、APIを分類するクラス名を括弧で囲み、二重コロン::
とclass
を付けます。
たとえば、標準ライブラリのuintArrayOf()
関数は、APIリファレンスに示されているように、@ExperimentalUnsignedTypes
に分類されます。
@ExperimentalUnsignedTypes
inline fun uintArrayOf(vararg elements: UInt): UIntArray
コードでのオプトインは次のようになります。
@OptIn(ExperimentalUnsignedTypes::class)
以下は、uintArrayOf()
関数を使用して符号なし整数の配列を作成し、その要素の1つを変更するためにオプトインする例です。
@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
は元本(初期投資額)です。r
は年利(小数)です。n
は1年間に利子が複利計算される回数です。t
は投資期間(年単位)です。
コードを更新して、次のことを行います。
kotlin.math
パッケージから必要な関数をインポートします。calculateCompoundInterest()
関数に、複利を適用した後の最終的な金額を計算する本体を追加します。
|--|--|
// 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
}
|---|---|
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
パッケージから正しいインポート文と関数を追加するようにコードを更新してください。
|---|---|
// 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
}
|---|---|
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
に分類されます。コードではオプトインはどのように記述されますか?
|---|---|
@OptIn(ExperimentalStdlibApi::class)
次のステップ
おめでとうございます!中級ツアーを完了しました!次のステップとして、人気のKotlinアプリケーションに関するチュートリアルをチェックしてください。
- Spring BootとKotlinでバックエンドアプリケーションを作成する
- AndroidとiOS向けのクロスプラットフォームアプリケーションをゼロから作成し、次のことを行います。