🌊
Kotlin におけるワンショットと Flow の違い
この記事では、Kotlin の非同期処理手法である ワンショット(One-Shot)と Flow の違いについて解説します。 両者の特徴や利用シーン、実装例を通じて、どのようなケースでどちらを選択すべきかを理解しましょう。
ワンショット(One-Shot)とは
ワンショットは、単一の値を返す非同期処理に適しています。
例えば、ネットワークから 1 件のデータを取得する処理など、一度の呼び出しで結果が得られるケースに向いています。
Kotlin では suspend
関数を用いて実装します。
ワンショットのコード例
suspend fun fetchUserData(userId: String): User {
// ネットワーク API を呼び出してユーザーデータを取得する例
val response = api.getUserData(userId)
return response.toUser()
}
上記のように、1 回の呼び出しで結果が得られるため、シンプルな非同期処理に最適です。
Flow とは
Flow は、複数の値を時系列で返す非同期ストリームを扱う仕組みです。
主な特徴は以下の通りです。
-
Cold Stream:
collect
が呼ばれるまで実行が開始されない。 - 豊富なオペレーター: 値の変換、フィルタリング、バッファリング、キャンセルなど、さまざまな演算子を利用可能。
- 連続データの処理: UI イベントやセンサーの値、リアルタイム更新など、連続して発生するデータの取り扱いに適している。
Flow のコード例
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
fun getNumbers(): Flow<Int> = flow {
for (i in 1..5) {
delay(1000) // 1 秒間待機
emit(i) // 数値を順次発行
}
}
collect
を呼ぶと実際の値が順次発行される Cold Stream であることが特徴です。
まとめ
-
ワンショット(suspend 関数)
- 単一の結果を返す非同期処理に最適(例: 1 回の API 呼び出し)。
- シンプルに結果が一度だけ必要な場合に使いやすい。
-
Flow
- 複数の値を連続して返す非同期ストリームを扱う。
- 高度なオペレーターを利用して、連続データの処理やキャンセルなどが容易。
用途に応じて、ワンショットとFlowを適切に使い分けることで、Kotlin での非同期処理をよりスムーズに実装できます。
Discussion