2.3 其他的一些顺序操作符

按顺序组合是functional effect 最基本的操作,ZIO提供了各种相关的运算符来满足通用需求。

zipWith

最基本的是zipWith,它将顺序地合并两个effect,并且可以让用户指定函数来作为回调函数处理两个结果。
例如,如果我们有两个effect提示用户的名字和姓氏,那么我们可以使用zipWith将这些effect按顺序组合在一起,将其结果合并为一个字符串:

val firstName = ZIO.effect(StdIn.readLine("What is your first name?"))
val lastName = ZIO.effect(StdIn.readLine("What is your last name"))
val fullName = firstName.zipWith(lastName)((first, last) => s"$first $last")

zipWith运算符的功能不如flatMap强大,因为它不允许第二个effect依赖第一个effect,即使该运算符仍然描述了从左到右的顺序合成。

zip,zipLeft,zipRight

其他变体包括:
zip,顺序地将两个effect的结果组合成结果的元组。
zipLeft,顺序地合并两个effect,并返回第一个的结果;
zipRight,依次组合两个effect并返回第二个结果。
有时,您会看到<*用作zipLeft的别名,而*>用作zipRight的别名。 当你不需要所有effect的结果,这些运算符就特别有用。
例如,在以下代码段中,我们顺序组合两个effect,返回右手effect的Unit成功值:

val helloWorld = ZIO.effect(print("Hello, ")) *> ZIO.effect(print("World!\n"))

在上面的例子里,*>非常有用,我们希望程序按顺序执行,但是左边的effect返回一个Unit,这个返回值并没有什么作用。

foreach,collectAll

foreach运算符返回单个effect,描述了按顺序对集合的每个元素执行作用。 它类似于过程编程中的for循环,它对值进行迭代,以某种方式处理它们并收集结果。
例如,我们可以创建一个effect来描述如何打印1到100之间的所有整数,如下所示:

val printNumbers = ZIO.foreach(1 to 100) { n => printLine(n.toString) }

同样,collectAll返回一个effect,该effect收集整个effect集合的结果。 我们可以使用它来收集多种print effect的结果,如以下代码片段所示:

val prints = List(    printLine("The"),printLine("quick"),printLine("brown"),printLine("fox")
)val printWords = ZIO.collectAll(prints)

到目前为止,您只要掌握了所学的知识,就可以将任何程序程序转换为ZIO程序. 只需要将要执行的内容包装在effect构造函数中,然后将它们与flatMap组合在一起。
如果仅此而已,您将不能充分利用ZIO必须提供的所有功能,但这是一个起点,并且在将旧代码迁移到ZIO时可以是一种有用的技术。

2.3 zio入门——一些常见的zio操作符相关推荐

  1. 2.2 zio入门——按顺序组合ZIO

    2.2 按顺序组合ZIO 正如上小节所述,ZIO效果是描述并发工作流的蓝图,并且我们通过转换和组合更小,更简单的效果来构建更复杂的效果,从而解决业务问题. 我们看到了如何使用 ZIO 的 delay ...

  2. 2.8 zio入门——标准ZIO服务

    2.8 标准ZIO服务 在本章的前面,我们讨论了ZIO环境类型,但是我们还没有使用它来编写任何程序. 在本书的后面,我们将深入介绍环境,并说明该环境如何为依赖项注入问题提供全面的解决方案. 现在,我们 ...

  3. 2.7 zio入门——更多的Effect构造函数

    2.7 更多的Effect构造函数 在本章的前面,我们了解了如何使用ZIO.effect构造函数将过程代码转换为ZIO效果.ZIO.effect构造函数是一种有用且通用的效果构造函数,但并不适合所有情 ...

  4. 2.4 zio入门——ZIO类型参数

    2.4 ZIO类型参数 我们之前说过,类型 ZIO [R,E,A]的值是一种 functional effect,需要环境R,并且可能因E失败或成功返回A. 现在,我们也了解了ZIO effect 成 ...

  5. 2.9 zio入门——递归和ZIO

    2.9 递归和ZIO 我们在本章前面谈到了使用flatMap和相关的运算符来顺序合成effect. 通常,如果调用递归函数,并且递归深度很大,则运行计算的线程可能会耗尽堆栈空间,这将导致您的程序引发堆 ...

  6. 数据可视化-echarts入门、常见图表案例、超详细配置解析及项目案例

    文章目录 数据可视化-echarts入门.常见图表案例及项目案例 一.简介 一.数据可视化简介 二.echarts简介 三.echarts特点 四.ZRender介绍 二.Echarts的基本使用 一 ...

  7. HTTPD入门和常见配置

    HTTPD入门和常见配置 一.HTTPD 介绍 1.1 常见 http 服务器 1.2 apache 介绍和 httpd 特点 1.2.1 apache 介绍 1.2.2 apache 特点 1.2. ...

  8. 2.5 zio入门——ZIO类型别名

    2.5 ZIO类型别名 ZIO的三个类型参数,功能极为强大.我们可以使用环境类型参数进行参数注入(数据库,连接池,配置等),并且可以使用错误和成功类型参数返回结果. 在最常见的情况下,程序需要向下传播 ...

  9. 2.6 zio入门——对比Future

    2.6 对比Future 本小节,我们可以通过比较Scala标准库中的ZIO和Future来阐明到目前为止所学的知识. 在本书后面讨论并发性时,我们将讨论ZIO和Future之间的其他差异,但目前要记 ...

最新文章

  1. 传递数组_Fortran:派生数组与数组传递进子程序耗费时间比较
  2. Linux下的一个图形管理工具webmin
  3. Bimsight视图及导航控制
  4. ajax请求失败后重连和promiseIfy
  5. Linux加载DTS设备节点的过程(以高通8974平台为例)
  6. leetcode--130. 被围绕的区域
  7. SAP CRM One Order框架搜索条件里,posting date下拉菜单的渲染逻辑
  8. python地理_【Python教程】地理可视化
  9. CompletableFuture详解~runAsync
  10. ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档
  11. linux使用samba实现文件共享
  12. VS2008中关于“加载安装组件时遇到问题。取消安装”的解决办法
  13. python extension c++ 扩展
  14. Python flask web基础(三)用wangeditor实现富文本编辑
  15. 进不了PE,进PE黑屏或点阵屏怎么办
  16. 001定位技术和算法有哪些?
  17. stm32 智能避障小车(二)之sg90
  18. CEFSharp 浏览器控件截图空白的解决方法
  19. java项目-第71期基于ssm的化妆品商城系统【毕业设计】
  20. linux ls 没权限,Linux Shell: ls 与 文件权限

热门文章

  1. element ui table组件筛选数据
  2. 豆粕5连跌四月季节性偏弱,铁矿石认购翻倍,甲醇05-09季节性反套2022.3.30
  3. 柏诚股份冲刺上交所:年营收27.4亿 拟募资4.7亿
  4. 2019年数学建模C题
  5. 快手热门早安文案正能量朋友圈
  6. SQLI DUMB SERIES-3
  7. baidu卫兵新版力推三级加快器 电脑一键提速50%
  8. linux 看usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备
  9. 14款S400升级20款S450外观套件
  10. Electron:前端人的最佳跨平台解决方案