Kotlin数据流 - - - Flow

一.Flow的特性与使用

1.使用Flow返回多个值

1.名为flow的Flow类型构建器函数。
2.flow{…}构建块中的代码可以挂起。
3.函数simpleFlow不再标有suspend修饰符。
4.使用emit函数发射值。
5.使用collect函数收集值。

 //通过flow返回多个值     flow函数可以不用挂起
    fun simpleFlow() = flow<Int> {
        for (i in 1..3) {
            delay(1000)//挂起
            emit(i)//发射产生一个元素
        }
    }

    //这里用协程写了个异步
    fun testMultipleValue3() = runBlocking {
        simpleFlow().collect { value ->
            print(value)
        }
    }

结果演示:

2.Flow冷流

 flow是一种类似与序列的冷流,flow构建器中的代码直到流被手机的时候才运行。

 fun simpleFlow02() = flow<Int> {
        println("Flow started")
        for (i in 1..3) {
            delay(1000)
            emit(i)
        }
    }

    //冷流   只有调用collect的时候Flow才会收集元素
    fun testFlowIsCold() = runBlocking {
        val simpleFlow02 = simpleFlow02()
        println("Calling collect...")
        simpleFlow02.collect { value ->
            println(value)
        }
        println("Calling collect again...")
        simpleFlow02.collect { value ->
            println(value)
        }
    }

打印结果:

3.Flow的连续性

1.流的每次单独收集都是按顺序执行的,除非使用特殊操作符。
2.从上游到下游每个过渡操作符都会处理每个发射出的值,然后再交给末端操作符。

 //Flow的连续性(链式调用)
    fun testFlowContinuation() = runBlocking {
        //Flow的构建器
        (1..5).asFlow().filter {
            it % 2 == 0
        }.map {
            "string  $it"  //变换类型
        }.collect {
            println("Collect $it")
        }
    }

结果演示:

4.Flow的构建器

1.fIowOf构建器定义了一个发射固定值集的流。
2.使用.asFlow()扩展函数,可以将各种集合与序列转换为流。

    //Flow的构建器 flowOf  asFlow
    fun testFlowBuilder() = runBlocking {
        flowOf("one", "two")
    //onEach 返回一个流,该流在上游流的每个值在下游发出之前调用给定的操作。
            .onEach {
                delay(1000)
            }.collect {
                println(it)
            }
        listOf(1,2,3).asFlow().collect { value -> println(value) }
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值