KotlinのコルーチンにおけるFlow
, SharedFlow
, StateFlow
は、それぞれ異なるリアクティブなデータストリームを表現するためのツールです。それぞれの使い方と用途について詳しく説明します。
Flow
Flow
は非同期データストリームを表現するために使用されます。これはCold Streamであり、コレクションが開始されるとデータの生成が始まります。
基本的な使い方
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun simpleFlow(): Flow<Int> = flow {
for (i in 1..3) {
delay(100) // 模擬的な非同期操作
emit(i) // データを発行
}
}
fun main() = runBlocking {
simpleFlow().collect { value ->
println(value)
}
}
SharedFlow
SharedFlow
はHot Streamであり、複数のコレクターが同じデータストリームを共有します。SharedFlow
はイベントを共有するために使用され、通常、複数のリスナーが存在する場合に利用されます。
基本的な使い方
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val sharedFlow = MutableSharedFlow<Int>()
launch {
sharedFlow.emit(1)
sharedFlow.emit(2)
sharedFlow.emit(3)
}
sharedFlow.collect { value ->
println("Collector 1: $value")
}
sharedFlow.collect { value ->
println("Collector 2: $value")
}
}
StateFlow
StateFlow
はSharedFlow
の特殊な形で、現在の状態を保持し、状態が変わるたびに更新を通知します。これもHot Streamであり、状態管理に適しています。
基本的な使い方
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val stateFlow = MutableStateFlow(0)
launch {
repeat(3) {
delay(100)
stateFlow.value = it
}
}
stateFlow.collect { value ->
println("Collector: $value")
}
}
Flow vs SharedFlow vs StateFlow
-
Flow:
- Cold Stream。
- コレクションが開始されたときにデータの生成が開始される。
- 各コレクターは独自のデータストリームを受け取る。
-
SharedFlow:
- Hot Stream。
- 複数のコレクターが同じデータストリームを共有する。
- データの履歴を保存するため、遅れてコレクトを始めた場合でも過去のデータを受け取れる。
-
StateFlow:
-
SharedFlow
の特殊な形で、状態を保持するために使用。 - 常に最新の状態を保持し、その状態が変わるたびに通知を送る。
-
使用例
状態の管理
StateFlow
は、状態を管理するのに非常に便利です。たとえば、UIの状態を管理するために使われます。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
class ViewModel {
private val _state = MutableStateFlow("Initial State")
val state: StateFlow<String> = _state
fun updateState(newState: String) {
_state.value = newState
}
}
fun main() = runBlocking {
val viewModel = ViewModel()
launch {
viewModel.state.collect { value ->
println("State: $value")
}
}
delay(1000)
viewModel.updateState("New State")
}
このように、StateFlow
を使ってUIの状態をリアクティブに管理することができます。SharedFlow
はイベントストリームの共有に、Flow
は非同期データストリームの処理にそれぞれ適しています。用途に応じて適切なツールを選択することで、Kotlinのコルーチンをより効果的に活用できます。