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时可以是一种有用的技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值