2.3 zio入门——一些常见的zio操作符
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操作符相关推荐
- 2.2 zio入门——按顺序组合ZIO
2.2 按顺序组合ZIO 正如上小节所述,ZIO效果是描述并发工作流的蓝图,并且我们通过转换和组合更小,更简单的效果来构建更复杂的效果,从而解决业务问题. 我们看到了如何使用 ZIO 的 delay ...
- 2.8 zio入门——标准ZIO服务
2.8 标准ZIO服务 在本章的前面,我们讨论了ZIO环境类型,但是我们还没有使用它来编写任何程序. 在本书的后面,我们将深入介绍环境,并说明该环境如何为依赖项注入问题提供全面的解决方案. 现在,我们 ...
- 2.7 zio入门——更多的Effect构造函数
2.7 更多的Effect构造函数 在本章的前面,我们了解了如何使用ZIO.effect构造函数将过程代码转换为ZIO效果.ZIO.effect构造函数是一种有用且通用的效果构造函数,但并不适合所有情 ...
- 2.4 zio入门——ZIO类型参数
2.4 ZIO类型参数 我们之前说过,类型 ZIO [R,E,A]的值是一种 functional effect,需要环境R,并且可能因E失败或成功返回A. 现在,我们也了解了ZIO effect 成 ...
- 2.9 zio入门——递归和ZIO
2.9 递归和ZIO 我们在本章前面谈到了使用flatMap和相关的运算符来顺序合成effect. 通常,如果调用递归函数,并且递归深度很大,则运行计算的线程可能会耗尽堆栈空间,这将导致您的程序引发堆 ...
- 数据可视化-echarts入门、常见图表案例、超详细配置解析及项目案例
文章目录 数据可视化-echarts入门.常见图表案例及项目案例 一.简介 一.数据可视化简介 二.echarts简介 三.echarts特点 四.ZRender介绍 二.Echarts的基本使用 一 ...
- HTTPD入门和常见配置
HTTPD入门和常见配置 一.HTTPD 介绍 1.1 常见 http 服务器 1.2 apache 介绍和 httpd 特点 1.2.1 apache 介绍 1.2.2 apache 特点 1.2. ...
- 2.5 zio入门——ZIO类型别名
2.5 ZIO类型别名 ZIO的三个类型参数,功能极为强大.我们可以使用环境类型参数进行参数注入(数据库,连接池,配置等),并且可以使用错误和成功类型参数返回结果. 在最常见的情况下,程序需要向下传播 ...
- 2.6 zio入门——对比Future
2.6 对比Future 本小节,我们可以通过比较Scala标准库中的ZIO和Future来阐明到目前为止所学的知识. 在本书后面讨论并发性时,我们将讨论ZIO和Future之间的其他差异,但目前要记 ...
最新文章
- 传递数组_Fortran:派生数组与数组传递进子程序耗费时间比较
- Linux下的一个图形管理工具webmin
- Bimsight视图及导航控制
- ajax请求失败后重连和promiseIfy
- Linux加载DTS设备节点的过程(以高通8974平台为例)
- leetcode--130. 被围绕的区域
- SAP CRM One Order框架搜索条件里,posting date下拉菜单的渲染逻辑
- python地理_【Python教程】地理可视化
- CompletableFuture详解~runAsync
- ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档
- linux使用samba实现文件共享
- VS2008中关于“加载安装组件时遇到问题。取消安装”的解决办法
- python extension c++ 扩展
- Python flask web基础(三)用wangeditor实现富文本编辑
- 进不了PE,进PE黑屏或点阵屏怎么办
- 001定位技术和算法有哪些?
- stm32 智能避障小车(二)之sg90
- CEFSharp 浏览器控件截图空白的解决方法
- java项目-第71期基于ssm的化妆品商城系统【毕业设计】
- linux ls 没权限,Linux Shell: ls 与 文件权限