ZIO Streams: В чем разница между ZSink и ZTransducer?
Я изучаю ZIO Streams, использую версию библиотеки 1.0.9.
zio-streams
. Я не могу найти ссылку, которая показывает мне разницу между
ZSink
и
ZTransducer
.
В чем разница?
2 ответа
A используется для потребления элементов из. В свою очередь, приемник вызовет материализацию всего потока и создаст значение.
А
ZTransducer
- это функция с отслеживанием состояния, которая обрабатывает фрагменты данных в потоке и, в отличие от функции, никогда не заканчивается.
Если мы посмотрим на банальный пример:
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
с
utf8Decode
который декодирует кусок байтов в String, а затем разбивает их по строкам. Наконец, мы используем
.run
метод и предоставить
ZSink
который выводит данные на консоль поэлементно.
Подробнее о новом дизайне ZStream можно прочитать здесь.
Этот:
ZStream
.fromFile(Paths.get("/foo"), chunkSize = 1024 * 4)
.transduce(utf8Decode >>> splitLines)
.run(ZSink.foreach(zio.console.putStr))
отлично работает для вывода на консоль. Но каков идиоматический способ потребления потока и записи значения (например, байтов/строки и т. д.)?
ZSink.take[String](1000).map(m => m.mkString("\n") + "\n")
производит вывод, но, очевидно, я не возвращаю весь ZStream, если у меня есть большой ввод. Наверное, упускаю из виду очевидное, но....