Twitter

反应式流

检出 interop-reactiveStreams 模块以获得对反应式流的互操作支持。 反应式流的 Producer 和 Subscriber ZIO 通过将 zio.stream.Stream 转换到 org.reactivestreams.Publisher,和将 zio.stream.Sink 转换到 org.reactivestreams.Subscriber 来集成 Reactive Streams。反之亦然。简单地引入 zio.interop.reactiveStreams._ 来让转换生效。 例子 首先,让我们导入一些内容。 我们使用以下发布者和订阅者作为示例: 将发布者作为流 将一个发布者作为流来使用时最多缓冲 qSize 个元素。如果可能的话,qSize 应该是 2 的幂以达到最佳性能。默认值为 16。 将订阅者作为接收器 当将一个订阅者连接到 Stream 时,需要一个旁支通道来处理故障。因此,toSink 返回 Promise 和 Sink 的元组。当流失败时,Promise 必须呈现失败状态,toSink 上的 type 参数代表 Stream 的错误类型。 将流作为发布者 将接收器作为订阅者 toSubscriber 返回一个 Subscriber 和一个IO,这个 IO 负责在接收器执行结束后,或当发布者产生错误时,返回结果。作为订阅者的用接收器最多缓冲 qSize 个元素。qSize 应该尽可能是 2 的幂以达到最佳性能。默认值为16。

Scalaz 7.x

ZIO 实例 如果您是 Scalaz 7.2 的忠实用户,那么 interop-scala7x 模块为它的几种类型类提供了 ZIO 支持,请查看源代码以获取更多详细信息。 例子 通过 ZIO 并行执行 Applicative 实例 由于 Applicative 和 Monad 相关的法则,ZIO 的 Applicative 实例必须通过 bind 来获得,因此组合多个 Applicative effect 时将只能串行获得。为了解除这个限制,ZIO 通过非 Monad 的标记(Tag)来并行执行 Applicative 实例。 例子

Monix

签出 interop-monix 模块以获得与 Monix 的互操作支持。 转换 Task 互操作层提供对以下转换的支持: 将 Task[A] 转为 UIO[Task[A]] 将 Task[A] 转为 Task[A] 要将 IO 转换为 Task,请使用以下方法: 要执行反方向的转换,请使用以下定义在 IO 伴随对象中的扩展方法: 请注意,为了将 Task 转换为 IO,需要使用适当的 Scheduler。 例子 转换 Coeval 要将 IO 转换为 Coeval,请使用以下方法: 要执行反方向的转换,请使用以下定义在 IO 伴随对象中的方法: 例子

JavaScript

通过将以下内容添加到您的 build.sbt 中,使得在 Scala.js 项目中支持 ZIO: 例子 您的 main 函数可以像下面这样通过扩展 App 得到。这个例子使用 scala-js-dom 来访问 DOM;要运行该示例,您将需要将该库作为依赖项添加到 build.sbt中。

Java

ZIO 与外部 Java 代码具有完全的互操作性。让我向您展示它的工作原理,然后讲解第一个案例,明天您就可以在工作中使用纯函数式 Java 了。 From Java CompletionStage and back CompletionStage 是(Java 提供的)最便捷的用于模拟函数式异步效果的 API(例如 ZIO)的接口,因此我们从它开始。轻而易举地: 您甚至可以将其变成纤程! 该 API 创建了一个不绑定具体对象的纤程。 此外,您如果希望将 ZIO 值转换为 CompletionStage 也易如反掌: 正如您所看到,它返回 CompletionStage 接口的具体类,即CompletableFuture。需要指出的是,只要可以将类型 E 的值转换为Throwable,那么任何 IO[E, A] 都可以变成 CompletableFuture: Java 的 Future 类 您可以通过 ZIO.fromFutureJava 将任何 java.util.concurrent.Future 嵌入 ZIO 计算中。一个简单的 Apache Async HTTP 客户端的例子看起来如下: 就这么简单。请注意,从对产出值的签名中可以看出,ZIO 在内部使用了阻塞Future#get 调用。显然,它被运行在阻塞线程池上,我想您应该清楚地知道。如果可能的话,请如上所述使用 ZIO.fromCompletionStage。 如果您需要,也可以使用 Fiber.fromFutureJava 将它转换为纤程。类似又有差别: NIO 完成具柄 通过提供完成处理具柄,Java 对使用 NIO API 的通讯通道执行异步处理,它通过将完成处理具柄挂接到可中断 I/O 中来实现。例如,读取文件的内容: 如您所见,ZIO 在此处提供了 CPS 样式的 API,与上面的两个例子有所不同,但是仍然非常优雅。

Future

Scala Future ZIO 现在提供了与 Scala 的 Future 的基本互操作性,并且不需要额外的模块提供支持。 转换自 Future 可以使用 ZIO.fromFuture 将 Scala 的 Future 转换为 ZIO effect: Scala 的 Future 也可以使用 Fiber.fromFuture 转换为 Fiber: 这是一个纯操作,因此于任何纤程执行公平性而言都是一个明智的注脚。 转换到 Future ZIO Task effect 可以通过 ZIO#toFuture 转换为 Future: 因为将 Task 转换为(即时的)Future 是效果化的,所以 ZIO#toFuture 的返回值是一个 effect。要真正开始执行 Future 并访问其中,必须使用 runtime 来执行 effect。 ZIO Fiber 可以通过 Fiber#toFuture 转换为 Future: 执行 Future Runtime 类型具有方法 unsafeRunToFuture,该方法可以异步执行 ZIO effect,并在 effect 执行完成时返回 Future。

Cats Effect

interop-cats 模块提供了与 Cats Effect 生态系统之间的互操作性。 要使用此模块,请将以下内容添加到 build.sbt 中: 大多数互操作功能包含在以下程序包中: Cats Effect 实例 ZIO 通过提供 Cats Effect 类型类的实例与 Typelevel 库集成。fs2,doobie 和http4s 以及函数式 Scala 生态系统中的各种其他库都使用这些类型类。 由于 Cats Effect 的限制,ZIO 无法提供任意错误类型的实例。相反,您只能获得它的错误类型扩展自 Throwable 的错误类型的 effect 的实例。 为了方便起见,ZIO 提供了 Task 和 RIO 类型别名,这些别名将错误类型固定为Throwable,对于与 Cats Effect 互操作可能有用: 为了对这些类型使用Cats Effect实例,您的 effect 的环境类型的作用域中应具有隐式的 Runtime[R]。以下代码片段为 ZIO 中内置的所有模块创建了一个隐式的Runtime: 如果将 RIO 用于自定义环境 R,则必须创建自己的 Runtime[R],并确保它隐式地出现在需要 Cats Effect 实例的任何地方。 Cats App 为方便起见,您的应用程序可以扩展自 CatsApp,这会自动将隐式 Runtime[Environment] 引入作用域。 Timer 为了获得 cats.effect.Timer[Task] 的实例,我们需要额外导入: 默认的“互操作”不提供“Timer[Task]”的导入的原因是,这使得对需要计时功能的程序的测试变得非常困难。额外的导入(仅在需要的时候)让与计时相关的 effect (的测试)变得更加简单合理。 例子 以下示例显示如何将 ZIO 与 Doobie(用于 JDBC 访问的库)和 FS2(流式库)一起使用,它们都依赖于Cats Effect实例:

摘要

ZIO 提供与广泛的生态系统的其他部分进行互操作的能力,它们包含以下: Future — ZIO 提供内建的在 ZIO 数据类型(例如 ZIO 和 Fiber)和 Scala 并发数据类型(例如 Future)之间进行转换的能力。 Java — ZIO 提供了内建的具在 ZIO 数据类型(例如 ZIO 和 Fiber)和 Java 并发数据类型(例如 CompletionStage, Future 和 CompletionHandler)之间进行转换的能力。 JavaScript — ZIO 对 Scala.js 具有一流的支持。 Scalaz 8 — Scalaz 8 基于 ZIO,其库中包含所有 ZIO 数据类型的实例。再无需其他模块提供额外支持。 interop-cats 提供了  Cats, Cats MTL 和 Cats Effect 库的实例,这些实例使您可以将 ZIO 与依赖这些库的其它库一起使用,例如 Doobie, Http4s, FS2 和 Circe interop-reactive-streams for Reactive Streams, 提供了将 ZIO Stream和 Sink 转换为反应式 Stream 的生产者和消费者的转换。 interop-scalaz for ScalaZ 7, 为 ScalaZ 7 提供了对 ZIO 数据类型(提供支持)的 Monad 和其他类型类的实例。 interop-twitter for Twitter’s com.twitter.util.Future interop-monix for Monix’s monix.eval.Task and monix.eval.Coeval interop-guava for Guava’s com.google.common.util.concurrent.ListenableFuture 以上部分让您了解将 ZIO 与您正在使用的任何库或平台集成起来有多么容易。

BACK TO TOP