Flow演算子:map、filter、transform、take
中間演算子を適用して、Flowの発行内容を変換・制限します。
「Flow演算子:map、filter、transform、take」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
Flow とは
Flow はコールドな非同期ストリームです。map、filter、transform などの中間演算子は遅延評価され、collect されたときにのみ実行されます。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun numbers(): Flow<Int> = flow {
repeat(5) { emit(it + 1) }
}
fun main() = runBlocking {
numbers().collect { println(it) }
}map 演算子
map は発行された各値を変換します。1対1の変換を遅延実行する演算子です。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..5).asFlow()
.map { it * it }
.collect { println(it) } // 1 4 9 16 25
}filter 演算子
filter は述語に一致する要素だけを通し、それ以外を破棄します。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..10).asFlow()
.filter { it % 2 == 0 }
.collect { println(it) } // 2 4 6 8 10
}transform 演算子
transform は最も汎用的な演算子です。入力要素ごとに、0個、1個、または複数の値を発行できます。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..3).asFlow()
.transform { n ->
emit("Item $n")
emit("Done $n")
}
.collect { println(it) }
}take 演算子
take(n) は最初の n 個の要素だけを取得し、その後 upstream の Flow をキャンセルします。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
repeat(100) { emit(it) }
}.take(3)
.collect { println(it) } // 0 1 2
}takeWhile と dropWhile
takeWhile は述語が true の間要素を取得し、dropWhile は述語が false になるまで要素を破棄します。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..10).asFlow()
.takeWhile { it < 5 }
.collect { println(it) } // 1 2 3 4
(1..10).asFlow()
.dropWhile { it < 5 }
.collect { println(it) } // 5 6 7 8 9 10
}演算子の連結
演算子は合成できます。各演算子が新しい Flow を返すため、宣言的なパイプラインを構築できます。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..20).asFlow()
.filter { it % 3 == 0 }
.map { it * 2 }
.take(4)
.collect { println(it) } // 6 12 18 24
}mapNotNull
mapNotNull は、マッピングと null の結果の破棄を1つの手順で行います。map + filter { it != null } と同等です。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flowOf("1", "two", "3", "four", "5")
.mapNotNull { it.toIntOrNull() }
.collect { println(it) } // 1 3 5
}flatMapConcat
flatMapConcat は各要素を Flow にマッピングし、その結果を順番に連結します。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..3).asFlow()
.flatMapConcat { n -> flowOf("$n-a", "$n-b") }
.collect { println(it) }
}副作用に使う onEach
onEach はストリームを変更せずに各要素へ副作用を適用します。パイプライン内でのログ出力や分析に適しています。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..5).asFlow()
.onEach { println("Processing: $it") }
.filter { it % 2 == 0 }
.collect { println("Collected: $it") }
}Flow はコールドである
collect を呼び出すたびに、Flow は最初から再実行されます。終端演算子によって collect が開始されるまで、要素の発行も変換も行われません。
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val flow = (1..3).asFlow().map { println("map $it"); it * 2 }
println("Before collect")
flow.collect { println("got $it") }
println("Second collect:")
flow.collect { println("got $it") } // runs again
}確認問題
upstream の各要素に対して、0個、1個、または複数の値を発行する演算子はどれですか。
まとめ
map は1対1で変換し、filter は要素を破棄し、transform は任意の数の値を発行し、take は個数を制限します。これらを宣言的に連結してください。Flow はコールドであり、collect されたときにのみ実行されます。
よくある質問
「Flow演算子:map、filter、transform、take」レッスンは無料ですか?
はい。「Flow演算子:map、filter、transform、take」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「Flow演算子:map、filter、transform、take」で何を学びますか?
中間演算子を適用して、Flowの発行内容を変換・制限します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Flow演算子:map、filter、transform、take」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Flow演算子:map、filter、transform、take
- catchとonCompletion:Flowのエラー処理
- combineとzip:複数のFlowを統合する
- flowOnとbuffer:コンテキストとバックプレッシャー