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, если у меня есть большой ввод. Наверное, упускаю из виду очевидное, но....

Другие вопросы по тегам