scala - ZIO Streams:ZSink 和 ZTransducer 有什么区别?
问题描述
我正在研究 ZIO Streams,使用版本 1.0.9 的库zio-streams
。我找不到任何可以显示 aZSink
和 a之间区别的参考资料ZTransducer
。
有什么不同?
解决方案
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
编码是基于块的,使用transduce
with utf8Decode
which 将一个字节块解码为 String,然后逐行拆分它们。最后,我们使用该.run
方法并提供一个一个ZSink
元素一个元素地向控制台发出数据的方法。
更多关于 ZStream 的新设计可以在这里找到。
推荐阅读
- c - 我的 C 函数代码有问题
- php - 使用 array_key_exist 检查用户传递的值是否存在于数组中。澄清 array_key_exist
- python - 在转义引号内捕获字符串
- scala - Scala:当它们具有相同的属性时将一些元素组合在一个列表中
- mongodb - 原始文档列表上的 MongoDB 聚合框架 $map
- javascript - 防止在画布上绘制矩形时闪烁
- mod-rewrite - 如何重写nextcloud的url
- swift - ViewController 未按预期执行 segue
- node.js - 如何正确转义 node-postgres 查询中的单引号?
- javascript - 我们可以在组件树的不同级别上有多个上下文吗?