协程中的流

2023-11-15

协程中的异步流 基础

一.什么是异步流

可以连续返回多个值

与集合的区别:集合可以返回多个计算好的值,但是只能一次性返回

与Rxjava 的流是同一个概念

二.如何创建异步流

1.最基础的流构建器 flow{}

  • flow { … } 构建块中的代码可以挂起,不再需要 suspend 修饰符。
  • emit 发射, collect 收集。flow 构建器中的代码直到流被收集的时候才运行
  • 不阻塞线程
  • collect在哪个协程中调用,如果没有特殊操作,则flow代码块也在相同协程中运行

``

fun simple(): Flow<Int> = flow {
    println("Flow started")
    for (i in 1..3) {
        kotlinx.coroutines.delay(1000)
        emit(i)
    }
}
fun main() = runBlocking {
     println("Calling simple function...")
     var flow = simple()
     println("Calling collect...")
     flow.collect { value -> println(value) }
     println("Calling collect again...")
     flow.collect { value -> println(value) }
}

结果显示

Calling simple function...
Calling collect...
Flow started
1
2
3
Calling collect again...
Flow started
1
2
3
end

2.flowof 构建器

定义一个发射固定值集的流

private fun simple2() = runBlocking {
    flowOf(1, 2, 3).collect { value -> println(value) }
}

3. asFlow() 扩展函数

使用asFlow() 扩展函数,可以将各种结合转换为流

private fun simaple3() = runBlocking {
    listOf(1, 2, 3).asFlow().collect { value -> println(value) }
}

三.操作符

1.filter , map 等过渡操作符

应用于上游,作用于下游

suspend fun performRequest(request: Int): String {
    delay(1000) 
    return "response $request"
}
private suspend fun simple5() {
    listOf(1, 2, 3).asFlow().filter { it > 2 }.map { performRequest(it) }
    .collect { println(it) }
}

结果显示

response 3

2.take限长操作符

当满足条件时,Flow 会被取消,此时会抛出异常。需要用try{} 来处理

private fun simple4(): Flow<Int> = flow {
    try {
        emit(1)
        emit(2)
        println("This line will not execute")
        emit(3)
    } catch (e: Exception) {
        e.printStackTrace()
    } finally{
      
    }

}
simple4().take(1).collect { it -> println(it) }

结果显示:

1
kotlinx.coroutines.flow.internal.AbortFlowException: Flow was aborted, no more elements needed

3.末端流操作符

  • 在流上用于启动流收集的挂起函数
  • collect 是最基础的末端操作符
  • toListtoSet。转化成各种集合
  • first 取第一个值
  • single 确保只发送一个值,否则就报错:java.lang.IllegalStateException: Expected only one element
fun simple6() = runBlocking {
    var first = listOf(1, 2, 3).asFlow().map { it + 1 }.first { it > 2 }
    println(first)
  
    var single = listOf(1).asFlow().map { it + 1 }.single()
    println(single)
}

4.flowOn 切换上下文

默认的,flow { ... } 构建器中的代码运行在相应流的收集器提供的上下文中

如果想让流运行在其他协程中,调用flowOn,创建一个新的协程供函数运行

fun simple7(): Flow<Int> = flow {
    for (i in 1..3) {
        Thread.sleep(100) 
        println("Emitting $i" + ",currentThread" + Thread.currentThread().name)
        emit(i)
    }
}.flowOn(Dispatchers.Default)
simple7().collect { value -> println("collect:" + value.toString().plus(",currentThread=" + Thread.currentThread().name)) }

结果显示

Emitting 1,currentThreadDefaultDispatcher-worker-1
collect:1,currentThread=main
Emitting 2,currentThreadDefaultDispatcher-worker-1
collect:2,currentThread=main
Emitting 3,currentThreadDefaultDispatcher-worker-1
collect:3,currentThread=main
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协程中的流 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • umijs中开启hd后配置的px2rem设置哪些样式转换为rem单位

    开启高清hd即使用rem单位 会自动把项目中的所有px单位转换为rem单位 并且根据屏幕大小自动调节html的基础font size 这样的好处一个网站不同大小分辨率效果基本一样 先贴一份umi的配置 config config js内容如
  • 副业怎么赚到钱?有哪些能赚钱的副业?

    副业怎么赚到钱 有哪些能赚钱的副业 所处城市偏僻的话 做网络上的副业最合适 不受地域限制 甚至在家 在路上 在单位工作间隙都能做 挣的跟一二线城市一样多 我列几个自己或者朋友真实做过的 都能挣到钱 就是没有月入过万那么夸张 一两千块还是很简
  • SoapUI、Jmeter、Postman三种接口测试工具的比较分析——灰蓝

    前段时间忙于接口测试 也看了几款接口测试工具 简单从几个角度做了个比较 拿出来与诸位分享一下吧 各位如果要转载 请一定注明来源 最好在评论中告知博主一声 感谢 本报告从多个方面对接口测试的三款常用工具进行比较分析 以便于在特定的情况下选择最
  • STL基本容器及算法

    STL 1 STL 常用容器 1 string 1 1基本概念 本质 string和C 风格的字符串 而string本质上是一个类 string和char 区别 char 是一个指针 string是一个类i 类内部封装了char 管理这个字
  • windows203+sql server 2000无法打开1433端口

    windows203 sql server 2000无法打开1433端口 1 如果你是win2003 那么一定要安装sql的补丁sp4 检查你的SQL有没有打补丁 没有的话要打上补丁 检查的方法是在查询分析器中运行 select versi
  • 如何构建多域名HTTPS代理服务器转发

    在当今互联网时代 安全可靠的网络访问是至关重要的 本文将介绍如何使用SNI Routing技术来构建多域名HTTPS代理服务器转发 轻松实现多域名的安全访问和数据传输 SNI代表 Server Name Indication 是TLS协议的
  • 接口测试 —— Requests库介绍

    1 Requests库 Requests库是用Python语言编写 基于urllib3模块 采用Apache2 Licensed开源协议的 HTTP 库 虽然Python的标准库中urllib3模块已经包含了平常我们使用的大多数功能 但是它
  • 2010.03.09(2)——Hibernate注解 无主键表

    2010 03 09 2 Hibernate注解 无主键表 今天写了个jfreechar从后台传数据的例子 就随便编了两个表 懒的写主键了 我用的是springmvc hibernate的方式 由于没有主键 我的注解如下 Entity Ta
  • 完整的 CentOS 系统服务器初始化配置、系统安全加固、系统内核参数优化以及常用软件安装脚本分享...

    描述 适用于企业内部 CentOS7 系列服务器初始化 系统安全加固脚本 内容包含了 网络初始化设置 软件更新源替换以及内核升级实践 时间时区初始化设置 系统安全加固 等保三级操作系统主机检查项 安全运维设置 系统内核参数 常用软件安装等
  • Vue技术_props配置(提高了组件的复用性)

    一 props简介 在Vue中 props属性是用于组件之间传递数据的一种机制 通过在子组件中定义props属性 可以接收父组件传递的数据 并在子组件中使用这些数据 下面是props属性的一些详细说明 1 定义和传递props 在子组件中使
  • 2.CMake的入门准备

    在计算机上获取以及安装CMake 在使用 CMake 之前 您需要在系统上安装或构建 CMake 二进制文件 在许多系统上 您可能会发现 CMake 已经安装或可以使用系统的标准包管理器工具进行安装 Cygwin Debian FreeBS
  • 【OpenCV • c++】直方图计算

    文章目录 一 什么是直方图 二 直方图的相关函数 1 计算直方图 calcHist 2 找寻最值 minMaxLoc 三 程序演示 1 色调 饱和度直方图 2 一维直方图 3 RGB 三色直方图 一 什么是直方图 直方图广泛应用于很多计算机
  • weex vue 动态添加图标字体

    研究半天才明白 其实就是unicode字符串解码成文字就可以了 就这么简单 简单
  • 送书|逆向系列-你一定要懂的MD5加密

    逆向的步骤 逆向的步骤主要包含以下几点 抓包 抓包的过程其实很简单 在学爬虫入门的时候 想必这是每一个同学都必学的一个阶段 打开开发者调试工具 刷新页面 即可在network面板查看到加载出来的数据包 调试 当找到目标数据包时 根据目标数据
  • 【100%通过率 】【华为OD机试真题c++】递增字符串【 2023 Q1A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 问题描述 定义字符串完全由 A 和 B 组成 当然也可以全是 A 或全是 B 如果字符串从前往后都是以字典序排列的 那么我们称之为严格递增字符串 给出一个
  • TypeError: expected Tensor as element 0 in argument 0, but got numpy.ndarray

    显而易见 是pytorch中的Tensor和numpy ndarry类型导致的问题 只需要进行array和tensor的转换就行 调用函数torch from numpy annotation 实现array转换tensor
  • 萤石智能猫眼质保

    总流程 1 官网 https www ys7 com loginRedirect 1 2 登录 3 进入售后界面 4 填写申请单 5 寄送 根据短信
  • 程序员面试大厂被拆台:干这么多年不懂设计模式谁会要

    正在敲代码的你 春节假期即将来临 复盘这1年 你印象最深刻的一件事是什么 有人在群里回答了一条扎心的答案 忙碌1年 每天996 回首2019除了加班再无成长可说 你以为只要把事情搞定了 成长是一件自然而然的事情 但是过段时间你发现之前犯过的
  • Java生成doc文档一(概念简介)

    在很多项目的实际工作中 后端可能需要将一些整合的数据输出成word pdf excel等形式的文档 最近我在项目也遇到这样的而需求 这里就记录下来是如何一步一步完成java后端生成doc文档的 由于现在word文档基本都是用到07以上 所以
  • 协程中的流

    协程中的异步流 基础 一 什么是异步流 可以连续返回多个值 与集合的区别 集合可以返回多个计算好的值 但是只能一次性返回 与Rxjava 的流是同一个概念 二 如何创建异步流 1 最基础的流构建器 flow flow 构建块中的代码可以挂起