🎉
Flowを学び直す〜その1〜
ちゃんとFlowを見直すために↓を見ながらふ〜んと思った内容をメモしていくシリーズ
※本当にシリーズ化するのか不明
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
させてあげるだけでいいから使えそう
map
やfilter
でできないような変換を実装するのに使えるとも記載があるので夢が広がりそうな一品
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