0Pricing
Kotlin Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Flow演算子:map、filter、transform、take
  2. catchとonCompletion:Flowのエラー処理
  3. combineとzip:複数のFlowを統合する
  4. flowOnとbuffer:コンテキストとバックプレッシャー
← Kotlin Academyに戻る