Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

Flow — 基本

KotlinのFlowは非同期のデータストリームです。『flow { emit() }』でデータを順次発行し、『collect { }』で受け取ります。リストと異なり遅延評価されるため、大量データや継続的なイベントの処理に適しています。

構文
// Flow の生成
val flow: Flow<型> = flow {
    emit(値)    // データを発行
    emit(値2)
}

// Flow の収集(コルーチン内で実行)
flow.collect { value ->
    // 受け取った値を処理
}

// 変換操作(中間演算子)
flow.map { it * 2 }
    .filter { it > 3 }
    .collect { println(it) }
関数一覧
関数 / 演算子概要
flow { emit() }新しい Flow を生成します。ブロック内で『emit()』を呼んで値を発行します。
flowOf(vararg)指定した値を発行する Flow を作成します。
List.asFlow()リストを Flow に変換します。
flow.collect { }Flow の値を受け取って処理します(終端演算子)。
flow.map { }各値を変換します(中間演算子)。
flow.filter { }条件に合う値だけを通します(中間演算子)。
flow.take(n)最初の n 件だけ取得します(中間演算子)。
flow.toList()全値を収集してリストにします(終端演算子)。
サンプルコード
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

// Flow を返す関数
fun countDown(): Flow<Int> = flow {
    for (i in 5 downTo 1) {
        delay(100)  // 非同期処理を模倣
        emit(i)
    }
}

fun main() = runBlocking {
    // Flow を collect で受け取ります。
    countDown().collect { value ->
        println("カウント: $value")
    }

    // flowOf で簡単に Flow を作ります。
    flowOf("Apple", "Banana", "Cherry")
        .map { it.uppercase() }
        .filter { it.startsWith("B") || it.startsWith("A") }
        .collect { println(it) }

    // リストを Flow に変換します。
    val total = (1..10).asFlow()
        .filter { it % 2 == 0 }      // 偶数だけ
        .map { it * it }              // 2乗
        .toList()
    println(total)  // [4, 16, 36, 64, 100]

    // take で件数を制限します。
    (1..100).asFlow()
        .take(3)
        .collect { println(it) }  // 1, 2, 3
}
概要

FlowはKotlinの非同期データストリームで、RxJavaのObservableに相当しますが、コルーチンとシームレスに統合されています。『collect』が呼ばれるまで実行されない「コールドストリーム」です。

中間演算子(『map』『filter』など)はチェーンしても遅延評価されます。実際の実行は終端演算子(『collect』『toList』など)を呼んだときにまとめて行われます。

コルーチンの基本はsuspend 関数を、コルーチン間のデータ通信はChannelを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。