Kotlinのコルーチンフロー(Flow)の基本と使い方を初心者向けに解説!非同期処理の第一歩
生徒
「KotlinのFlowって聞いたんですけど、どういうものなんですか?」
先生
「Flowは、Kotlinの非同期処理の中で使われる仕組みのひとつで、時間をかけて複数の値を順番に送るための仕組みなんですよ。」
生徒
「非同期処理ってなんだか難しそうですね…」
先生
「大丈夫、まずはFlowの基本から順番に見ていきましょう!」
1. KotlinのFlow(フロー)とは?
Flow(フロー)は、Kotlinで非同期(ひどうき)に値を連続して取り扱うためのしくみです。非同期とは、「同時に複数のことを行う仕組み」のことです。例えば、スマホで音楽を聞きながらゲームをするような状態をイメージするとわかりやすいです。
通常の関数はすぐに1つの結果を返しますが、Flowを使うと時間差でいくつもの値を順番に「流す(emit)」ことができます。
2. なぜFlowが必要なの?
スマホアプリやWebアプリでは、ボタンを押したらサーバーからデータを取得したり、ネットワーク越しに結果を受け取るといった「待つ」処理が多くあります。こうした処理を一度にまとめて書くと、アプリが固まってしまうことがあります。
そこで登場するのが非同期処理。Flowは、非同期で複数の値を安全に順番に処理したいときにとても便利な仕組みです。
3. Flowの基本的な使い方
ここでは、簡単なFlowのサンプルコードを見てみましょう。時間差で1〜3の数字を順番に出力するコードです。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
numberFlow().collect { value ->
println("受け取った値: $value")
}
}
fun numberFlow(): Flow<Int> = flow {
emit(1)
delay(500)
emit(2)
delay(500)
emit(3)
}
このコードでは、emit関数を使って1つずつ値を送っています。delayは「少し待つ」ための関数です。500ミリ秒(0.5秒)ずつ待って、次の値を流しています。
4. 実行結果
上記のコードを実行すると、下記のように値が時間を空けて出力されます。
受け取った値: 1
受け取った値: 2
受け取った値: 3
5. FlowとListの違いって何?
Listは一気に全てのデータを持っている配列のようなものですが、Flowは「順番に、時間差で、あとから値がやってくる」のが特徴です。
たとえば、配達で考えると、Listは最初に荷物が全部届く感じ、Flowは1つずつ時間をかけて順番に荷物が届く感じです。
6. Flowでよく使う関数:collectとmap
Flowで出てきた値を受け取るにはcollectを使います。これは「受け取る」という意味です。
また、出てきた値に加工を加えるにはmapを使います。たとえば、数字を2倍にしたいときは以下のように書きます。
fun main() = runBlocking {
numberFlow().map { it * 2 }.collect { value ->
println("2倍の値: $value")
}
}
7. Flowの背後にある「コルーチン」とは?
Flowは、Kotlinの「コルーチン(coroutine)」という仕組みの上で動いています。コルーチンとは、簡単に言うと「軽いスレッド」のようなもので、普通のスレッドよりもメモリやCPUを使わずに効率的に動きます。
この仕組みにより、Flowは重くなりがちな非同期処理をサクサク動かすことができるのです。
8. Flowはどんな場面で使える?
例えば、次のような場面でFlowはよく使われます:
- 天気アプリで数秒ごとに天気を更新する
- チャットアプリで新しいメッセージをリアルタイムに受信する
- ニュースアプリでスクロールに合わせて記事を読み込む
このように、Flowは「少しずつ、ゆっくり流れてくるデータ」にぴったりな道具です。
9. Flowの注意点と制限
Flowは便利な反面、以下のような注意点もあります:
- メインスレッド(画面を操作する部分)で直接重たい処理をしない
collectしないとFlowは始まらない(怠惰評価)- 例外が発生したときは
catchでちゃんと処理する
初心者のうちは「collectしないと値が出てこない」という点が特につまずきやすいので注意しましょう。