KotlinのwithContext、suspend、inlineの詳細解説

withContext withContextはコルーチンのディスパッチャを一時的に変更するための関数です。以下はその使用例です。

package com.kotlin.coroutines.example

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext

@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
fun main() {
    runBlocking(Dispatchers.IO) {
        println("メインディスパッチャ: ${coroutineContext[CoroutineDispatcher]}")
        
        launch {
            // 別のディスパッチャで実行
            val result = withContext(Dispatchers.Default) {
                delay(2000)
                println("デフォルトディスパッチャ: ${coroutineContext[CoroutineDispatcher]}")
                42
            }
        }
        
        println("メインディスパッチャ: ${coroutineContext[CoroutineDispatcher]}")
    }
}

suspend suspendキーワードは非同期処理を表す修飾子です。以下はその使用例です。

package com.kotlin.coroutines.example

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
fun main() {
    runBlocking {
        launch {
            val result = fetchData()
            println("取得データ: $result")
        }
        
        println("メイン処理")
    }
    
    println("プログラム終了")
}

// suspend修飾子付きの非同期関数
suspend fun fetchData(): String {
    delay(5000)
    return "データ"
}

inline inlineキーワードは関数呼び出しのオーバーヘッドを削減するための最適化です。以下はその使用例です。

package com.kotlin.coroutines.example

fun main() {
    val output = processValue(10) { value ->
        println("処理中: $value")
    }
}

// inline修飾子付きの高階関数
inline fun processValue(input: Int, action: (Int) -> Unit): Int {
    println("前処理: $input")
    action(input * 2)
    return input + 1
}

このコードでは、inlineキーワードはprocessValue関数に適用されています。これはコンパイラが関数本体を呼び出し元に直接コピーし、関数呼び出しのスタックを生成しないことを意味します。この最適化により、関数呼び出しの時間オーバーヘッドを削減し、プログラムのパフォーマンスを向上させます。inlineキーワードは通常、関数がパラメータとして渡される場合に使用され、関数呼び出しによるパフォーマンスの損失を避けるために役立ちます。

タグ: Kotlin コルーチン withContext suspend inline

5月21日 11:54 投稿