入门——一些常见的zio操作符"/>
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操作符
发布评论