什么是Zio效应构建器?

539 阅读4分钟

阅读时间: 3 分钟

ZIO Effect Constructor

在这篇博文中,我们将讨论ZIO效果构造器以及我们如何使用它们。然后,我们将看看纯计算的效果构造器和侧面影响的计算。

ZIO效果构造器

一个功能效果是一个并发工作流的模板。这个模板主要是描述性的,用来测试任何副作用。如数据库交互、日志记录、网络上的数据流,或请求批准。

我们可以将任何程序性程序转换为ZIO,方法是将每个语句包裹在一个构造函数中,如ZIO.effect,然后用flatMap或for comprehensions将这些语句绑定在一起。

纯粹值的效果构造函数

纯值或表达式是没有任何副作用的表达式。而纯函数是指其主体由纯表达式组成的函数。

ZIO包括一些效果构造函数,用于将纯值转换为ZIO效果。这些构造函数对于合并其他由副作用代码构建的ZIO效果和纯代码特别有用。

因此,ZIO.effect构造函数接收副作用代码,并将其转换为纯值,其中仅有任何副作用。此外,一些ZIO特性,如环境、类型化错误和堆栈安全,可以使纯代码受益。

ZIO.success

ZIO.success效果构造函数将一个值转换为一个成功的效果。**比如说。**ZIO.success("Hello, ZIO")构造一个成功的效果,其值为Hello, ZIO。由ZIO.success返回的效果的失败类型是Nothing,因为用这个构造函数创建的效果永远不会失败。

val task1: ZIO[Any, Nothing, String] = ZIO.succeed("Hello, ZIO")

ZIO.fail

ZIO.fail构造函数将一个值转化为一个以该值失败的效果。例如。ZIO.fail(new Exception) 构建一个因指定的异常而失败的效果。由ZIO.fail返回的效果的成功类型是Nothing,因为用这个构造函数创建的效果不能成功。同样不能成功的效果,无论是因为它们失败还是因为它们永远运行,通常使用Nothing作为成功类型。

val task2: ZIO[Any, String, Nothing] = ZIO.fail("This will fail with an exception.")

ZIO.fromEither

ZIO.fromEither效果构造函数将一个Either[E, A]转化为一个IO[E, A]效果。如果Either是Left,那么产生的ZIO效果将以E失败,但如果它是Right,那么产生的ZIO效果将以A成功。

val task3: ZIO[Any, Nothing, String] = ZIO.fromEither(Right("This is successful"))

ZIO.fromOption

一个Option ,可以用ZIO.fromOption转换为一个ZIO效果。一个Option[A]要么是一个带有数值的Some[A],要么是一个None,没有其他信息。所以一个Option可以失败,但基本上只有一种方式可以失败,那就是None的值。

val task4: ZIO[Any, Option[Nothing], Int] = ZIO.fromOption(Some(29))

val task5: ZIO[Any, Option[Nothing], Int] = ZIO.fromOption(None)

ZIO.fromTry

一个Try ,可以通过ZIO.fromTry转换为一个ZIO效果。产生的效果的错误类型总是Throwable,因为Try ,只有Throwable类型的值才会失败。

val task6: Task[Int] = ZIO.fromTry(Try(23/0))

侧面效应的效果构造器

用于副作用计算的效果构造函数是最重要的。这些构造函数将程序性代码转化为ZIO的效果,从而形成蓝图,将 "什么 "和 "如何 "分开。

ZIO可以将同步和异步的副作用转换成ZIO效果,即纯值。这些函数可以用来包装程序性代码,使我们可以结合Scala和Java代码以及第三方库来使用所有的ZIO特性。让我们看看一些用于副作用计算的构造函数。

ZIO.effect

一个同步的副作用可以通过ZIO.effect转换为一个ZIO效果。产生的效果的错误类型将总是Throwable,因为一个副作用的计算可以抛出一个异常,这将导致Throwable类型。

val task7: ZIO[Any, Throwable, Unit] = ZIO.effect(println("Learning ZIO !!"))

ZIO.effectTotal

有时,当我们想把副作用代码转换为ZIO效果,并且我们知道副作用代码不会抛出任何异常。对于这些情况,我们可以使用构造函数ZIO.effectTotal,它可以将程序性代码转换为一个不能失败的ZIO效果。比如说:检查系统时间或产生一个随机变量显然是副作用,但它们不能产生异常。

val task8: ZIO[Any, Nothing, Unit] = ZIO.effectTotal(println("This will not throw an exception."))

ZIO.effectAsync

一个具有基于回调的API的异步副作用可以通过ZIO.effectAsync转换为一个ZIO效果。异步的ZIO效果比基于回调的API更容易使用,而且它们可以从ZIO的特性中受益,比如中断、资源安全和卓越的错误处理。

总结

感谢你们读完了这篇博客,我希望你们获得了一些关于不同类型的ZIO效果构造器的知识。