Kotlin 系列 之 Flow (一)

Kotlin 系列 之 Flow (一)

Hello I`am Flow , 一看到 Flow 就会很自觉的将它跟 【线程 同步 异步 阻塞】 …巴拉巴拉联系到一起

我想说,这就对了!

所以在介绍Flow 之前,先来参观一下我们之前的撸码场景:

Example 1

一次性返回 所有结果,阻塞线程 ,如果List 中的每个元素都需要很长时间,或者List很长的话。。。 (脑补上厕所pang guang炸裂~)差评!

private fun  myMethod() : List<String> = listOf("AA","bb","CC")
fun main() {
    myMethod().forEach { println(it) }
}

Example 2

会一个一个的返回结果,但是也会阻塞线程。(虽然不会炸裂,但是我还年轻啊,qian lie xian 没问题啊~)差评!

private fun myMethod():Sequence<String> = sequence{

    for (index in 100..105){
        Thread.sleep(1000)
        yield("$index -> abc")
    }
}
fun main() {
    myMethod().forEach { println(it) }
}

Example 3
使用协程 ,不阻塞线程,但是一次性返回。(突然泄洪也不是长久之计啊~) 中评!

private suspend fun myMethod():List<String>{
    delay(1000)
    return listOf("hello","World","hello world")
}
fun main() = runBlocking {
    myMethod().forEach { println(it) }
}

那么有没有一种,即不阻塞也能够,一个一个返回的方法呢

天空一声巨响,Flow 闪亮登场!~


一 Flow 的开启
先说结果是 “ 交替打印 ” 的 ,说明 launch{} 与 myMethod() 是并发执行的

flow{} 中的执行结果 ,由 emit() 依次发射返回。

Flow 里面的值是通过 collect 方法收集的,由 collect 开始执行。

flow{} 构建器 中的代码是可以 挂起 的,无需在使用 suspend 标识符
 

private fun myMethod() = flow{
     for (i in 1..4){
         delay(100)
         emit(i)
     }
}

fun main() = runBlocking<Unit> {
    launch {
        for (i in 1..4){
            println("hello $i")
            delay(200)
        }
    }

    myMethod().collect{ println("$it")}
}

PS:
1 . 这里注意一下 collect 的导包,使用返回值时Unit的

​2 . 直接调用myMethod() 方法是不会执行的,需要调用 Flow 的 ‘终止操作’(如 collect)才会真正执行

二、 Flow 的取消

Flow 自身并没有 额外的取消概念

它的取消是借助于 它所在的协程(如 delay)可以被取消

结果是会打印两次 “Fan:1” “Fan:2”,伴随着 withTimeoutOrNull 协程的取消而取消。

private fun myMethod() = flow{
     for (i in 1..4){
         delay(100)
         println("Fan:$i" )
         emit(i)
     }
}

fun main() = runBlocking<Unit> {
    withTimeoutOrNull(220){
        myMethod().collect()
    }
}

Flow builder(流构建器)

  • flow 是最经常被用到的一种流构建器
  • flowOf 构建器 可用于定义能够发射固定数量值的流
  • 作为 集合 与 序列 ,它们都提供了 asFlow () 将自身转换为 Flow
fun main() = runBlocking {

    // 1 asFlow
    (1..10).asFlow().collect{ println(it)}
    println("------")

    // 2 flowOf
    flowOf(10, 20, 30, 40, 50).collect{ println(it)}
    
}

本小结 介绍了 Flow 的 开启 、 取消 和 构建器 >>>> 下一节 Flow(二)Flow的中间运算符
————————————————
版权声明:本文为CSDN博主「翻滚吧章鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37558974/article/details/120006221

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值