🎉

Flowを学び直す〜その1〜

2021/08/03に公開

ちゃんとFlowを見直すために↓を見ながらふ〜んと思った内容をメモしていくシリーズ
※本当にシリーズ化するのか不明
https://kotlinlang.org/docs/flow.html#transform-operator

transformオペレータ

viewLifecycleOwner.lifecycleScope.launch {
    (1..3).asFlow().transform { request ->
        emit("Making request $request")
        delay(500)
        emit(request)
    }.collect { response ->
        if (response is String) {
            println(response)
        } else {
            println("Not String $response")
        }
    }
}

公式だと重い処理を呼ぶ前に文字を渡しておいて、結果を受け取り次第渡すような使い方ができるとのこと
ロード中のアニメーションをわざと表示させたい時でもdelayさせてあげるだけでいいから使えそう
mapfilterでできないような変換を実装するのに使えるとも記載があるので夢が広がりそうな一品

Terminal flow

val sum = (1..5).asFlow()
    .map { it * it } // squares of numbers from 1 to 5
    .reduce { a, b ->
        println("A:$a B:$b")
        a + b
    } // sum them (terminal operator)
println(sum)
2021-08-03 20:47:39.316 11857-11857/sobaya.example.allflow I/System.out: A:1 B:4
2021-08-03 20:47:39.317 11857-11857/sobaya.example.allflow I/System.out: A:5 B:9
2021-08-03 20:47:39.317 11857-11857/sobaya.example.allflow I/System.out: A:14 B:16
2021-08-03 20:47:39.317 11857-11857/sobaya.example.allflow I/System.out: A:30 B:25
2021-08-03 20:47:39.317 11857-11857/sobaya.example.allflow I/System.out: 55

reduceは前回の値と新しく渡された値を貰えるのね。

val sum = (1..5).asFlow()
    .map { it * it } // squares of numbers from 1 to 5
    .fold(1) { a, b ->
        println("A:$a B:$b")
        a + b
    } // sum them (terminal operator)
    println(sum)
}
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: A:1 B:1
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: A:2 B:4
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: A:6 B:9
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: A:15 B:16
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: A:31 B:25
2021-08-03 21:02:02.152 13054-13054/sobaya.example.allflow I/System.out: 56

foldは初期値を指定したうえでreduceと同じような動きをする

初日はここまで

Discussion