当前位置: 首页 > news >正文

【Kotlin 协程】Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )

文章目录

  • 一、流的构建器函数
    • 1、flow 构建器
    • 2、flowOf 构建器
    • 3、asFlow 构建器





一、流的构建器函数



1、flow 构建器


在之前的博客

  • 【Kotlin 协程】Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
  • 【Kotlin 协程】Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )

中 , 介绍了 flow 流构建器函数 , 其基本用法如下 :

    /**
     * 使用 flow 构建器 Flow 异步流
     * 在该异步流中, 异步地产生 Int 元素
     */
    suspend fun flowFunction() = flow<Int> {
        for (i in 0..2) {
            // 挂起函数 挂起 500ms
            // 在协程中, 该挂起操作不会阻塞调用线程, 会继续执行其它代码指令
            // 500ms 恢复执行, 继续执行挂起函数之后的后续代码指令
            delay(500)
            // 每隔 500ms 产生一个元素
            // 通过调用 FlowCollector#emit 生成一个元素
            emit(i)
        }
    }

在 flow 流构建器中 , 调用 FlowCollector#emit 函数 发射元素 , 然后在外部 调用 Flow#collect 函数 收集元素 ;


2、flowOf 构建器


使用 flowOf 构建器函数 , 可以创建一个 发射指定元素 的 Flow 异步流 ;


代码示例 :

package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 携程中调用挂起函数返回一个 Flow 异步流
        runBlocking {
            flowOf(0, 1, 2, 3).onEach {
                // 每次发射元素时调用的代码块
                // 这里调用 kotlinx.coroutines.delay 函数挂起 1 秒
                delay(1000)
                println("发射元素 $it")
            }.collect {
                // 每隔 1 秒接收一个元素
                println("接收到元素 $it")
            }
        }
    }
}

执行结果 :

2022-12-23 13:10:55.579 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 0
2022-12-23 13:10:55.580 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 0
2022-12-23 13:10:56.581 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 1
2022-12-23 13:10:56.581 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 1
2022-12-23 13:10:57.619 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 2
2022-12-23 13:10:57.619 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 2
2022-12-23 13:10:58.659 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 3
2022-12-23 13:10:58.659 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 3

在这里插入图片描述


3、asFlow 构建器


使用 数组 , 区间 , 集合 , 序列 的 扩展函数 asFlow 函数 , 可以 将 集合 或 序列 转为 Flow 异步流 ;


代码示例 :

package kim.hsl.coroutine

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 携程中调用挂起函数返回一个 Flow 异步流
        runBlocking {
            (0 ..3).asFlow().onEach {
                // 每次发射元素时调用的代码块
                // 这里调用 kotlinx.coroutines.delay 函数挂起 1 秒
                delay(1000)
                println("发射元素 $it")
            }.collect {
                // 每隔 1 秒接收一个元素
                println("接收到元素 $it")
            }
        }
    }
}

执行结果 :

2022-12-23 13:31:54.862 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 0
2022-12-23 13:31:54.863 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 0
2022-12-23 13:31:55.867 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 1
2022-12-23 13:31:55.868 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 1
2022-12-23 13:31:56.882 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 2
2022-12-23 13:31:56.883 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 2
2022-12-23 13:31:57.922 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 3
2022-12-23 13:31:57.922 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 3

在这里插入图片描述

相关文章:

  • 聚焦汽车智能化与电动化,亚洲领先的汽车工业技术博览会 2025年11月与您相约 AUTO TECH 华南展
  • 华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)
  • PHP 数组排序类型介绍
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战7-ArkTS语法进阶
  • Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?
  • Rabbitmq中得RPC调用代码详解
  • PostgreSQL对已有表增加自增序列
  • uni-app webview 打开baidu.com
  • T - SQL使用事务 及 在Winform使用事务
  • MongoDB - readConcern
  • Android和Linux的开发差异
  • Easy-Jmeter: 性能测试平台
  • WMS系统这么重要?一文教你找到理想中的WMS系统
  • 【Python】matplotlib.axes.Axes.pie()实例讲解
  • 路由器的工作原理(计算机网络-网络层)
  • 【Vue 快速入门系列】如何更优雅的使用vuex进行组件间通信
  • 【Python测试】期末测试
  • STM32正点原子图片——显示实验
  • DSP_TMS320F28377D_eCAP学习笔记
  • 蓝牙耳机什么牌子好?音质好、配置高的蓝牙耳机分享
  • Java时间差
  • PyTorch笔记 - Batch\Layer\Instance\Group\Weight Normalization 源码
  • 三、Flex布局简介
  • 软考《系统集成项目管理工程师》必备100题(4)
  • 每月明星计划(12 月),ECHO:我们的意见万岁!
  • 【Linux】第五部分 网络配置
  • Linux系统下的用户管理
  • MySQL字段长度修改 锁表情况分析
  • 蓝桥杯备赛Day2——知识拾遗
  • 嵌入式软件开发为什么需要DevOps?
  • 艾美捷游离巯基检测试剂盒基本参数和特点说明
  • python基础(15):面向对象编程