Hello I`am Flow ,Welcome to Flow Unit 2
说到 中间运算符 ,用过 RxJava 的同学可能会想,难道是命运的安排 ?
我想说:这就是命啊!~ 他两的关系就是 (PX剑谱 和 KH宝典)
PS:Flow 的中间 运算符内的代码块 是可以 调用挂起函数的
Example 1 (耳熟能详的 map 、filter)
map :对结果进行加工后继续向后传递
filter : 对待操作的值 进行过滤
private suspend fun myMapFun(input:Int): String {
delay(1000)
return "output: $input"
}
fun main() = runBlocking {
(1..4).asFlow()
.filter{ it > 2}
.map{input-> myMapFun(input)}
.collect{ println(it)}
}
结果打印: "output: 3"
"output: 4"
Example 2 (清清白白的 tranform)
上面的map 和 filter 都有自身特定的功能(小爷我干这活贼6,但是别的不会 - -!)
transform :没有附加功能,白纸一张,码农咋写 咱咋发射。
private suspend fun myFun(input:Int): String {
delay(1000)
return "output: $input"
}
fun main() = runBlocking {
(1..2).asFlow()
.transform{input ->
emit("hello $input")
emit("world $input")
emit(myFun(input))
}
.collect{ println(it)}
}
结果打印: "hello: 1"
"world: 1"
"output: 1"
"hello: 2"
"world: 2"
"output: 2"
Example 2 (适可而止的 take)
take 会限制 emit() 发射的次数 (你想发射就发射?)
PS:take 的入参 <= emit 发射的次数时,会抛出异常
fun myNumber() = flow {
try {
emit(1)
println("hello")
emit(2)
println("world")
emit(3)
}catch (ex:Exception){
println(ex)
}finally {
println("finally")
}
}
fun main() = runBlocking {
myNumber().take(2).collect{ println(it)}
}
结果打印: "1"
"hello"
"2"
"kotlinx.coroutines.flow.internal.AbortFlowException:....."
"finally"
collect 之外的【终止操作】
终止操作:才会真正的执行 flow
有 collect 、toList、toSet、count、reduce、collectLatest 等
下面 挑两个 look look ;
Example 3 (葫芦娃合体的 reduce)
reduce 让结果之间再次运算
fun main() = runBlocking {
var result3= (1..7).asFlow()
.map{ it * 1 }
.reduce{a,b -> a * b}
println(result3)
打印结果:28
}
Example 4 (说打就打的 collectLatest)
collectLatest collectLatest块中的执行时间大于emit发射的间隔时间,那么将会被emit 打断
emit:(这货话太多了)不好意思我插一句!!
官方栗子:
flow {
emit(1)
delay(50)
emit(2)
}.collectLatest { value ->
println("Collecting $value")
delay(100)
println("$value collected")
}
结果打印: "Collecting 1"
"Collecting 2"
"2 collected"
还有很多操作大家可以探索一下 欢迎评论区留言 !~~
小结:本次介绍了一些常用的 中间运算符 和 终止操作 下一节 Flow(三)执行上下文原理
|