ZIO Streams:ZSink 和 ZTransducer 之间有什么区别?

ZIO Streams: Which is the difference between a ZSink and a ZTransducer?

我正在研究 ZIO Streams,使用 1.0.9 版的库 zio-streams。 我找不到任何参考文献来说明 ZSinkZTransducer 之间的区别。

有什么区别?

A ZSink 用于消耗 ZStream 中的元素。反过来,接收器将导致整个流的具体化 运行 通过并产生一个值。

A ZTransducer 是一个有状态函数,它处理流中的 数据,与 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 编码是基于块的,并且使用 transduceutf8Decode 将字节块解码为字符串,然后按行拆分它们。最后,我们使用 .run 方法并提供一个 ZSink 将数据逐个元素发送到控制台。

有关 ZStream 新设计的更多信息 can be found here.