🌊

Kotlin におけるワンショットと Flow の違い

2025/02/11に公開

この記事では、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