首页 > 解决方案 > ZIO Streams:ZSink 和 ZTransducer 有什么区别?

问题描述

我正在研究 ZIO Streams,使用版本 1.0.9 的库zio-streams。我找不到任何可以显示 aZSink和 a之间区别的参考资料ZTransducer

有什么不同?

标签: scalaziozio-streams

解决方案


AZSink用于消耗 中的元素ZStream。反过来,sink 将导致整个流的物化贯穿并产生一个值。

AZTransducer是一个有状态的函数,它处理流中的数据,与 a 相比,ZSink它的处理永远不会结束。

如果我们看一个简单的例子:

import zio.stream.{ ZSink, ZStream }
import zio.stream.ZTransducer.{ splitLines, utf8Decode }

import java.nio.file.Paths

ZStream
  .fromFile(Paths.get("/foo"), chunkSize = 1024 * 4)
  .transduce(utf8Decode >>> splitLines)
  .run(ZSink.foreach(zio.console.putStr))

我们可以看到新的ZStream编码是基于块的,使用transducewith utf8Decodewhich 将一个字节块解码为 String,然后逐行拆分它们。最后,我们使用该.run方法并提供一个一个ZSink元素一个元素地向控制台发出数据的方法。

更多关于 ZStream 的新设计可以在这里找到。


推荐阅读